当我遇到一些错误时,我正在构建一个应用程序。在做了一些研究后,我发现原因是因为我正在使用2个文件,每个文件相互#import
。我读到,解决这个问题的方法是使用前瞻性声明,但我找不到一个如何做到这一点的好例子。
这就是我所拥有的。
RootViewController.h
#import <UIKit/UIKit.h>
#import "FirstDetailViewController.h"
@protocol SubstitutableDetailViewController
- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem;
- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem;
@end
@interface RootViewController : UITableViewController <UISplitViewControllerDelegate, FirstDetailViewControllerDelegate>{
UISplitViewController *splitViewController;
UIPopoverController *popoverController;
UIBarButtonItem *rootPopoverButtonItem;
NSMutableArray *logMessages;
}
@property (nonatomic, assign) IBOutlet UISplitViewController *splitViewController;
@property (nonatomic, retain) UIPopoverController *popoverController;
@property (nonatomic, retain) UIBarButtonItem *rootPopoverButtonItem;
@end
FirstViewDetailController.h
#import <UIKit/UIKit.h>
#import "RootViewController.h
//test2
@protocol FirstDetailViewControllerDelegate <NSObject>
- (void)addItemViewController:(FirstDetailViewController *)controller didFinishEnteringItem:(NSString *)item;
@end
//end test2
@interface FirstDetailViewController : UIViewController <SubstitutableDetailViewController> {
//for the output
IBOutlet UITextView *outputView;
UIToolbar *navigationBar;
}
@property (nonatomic, retain) IBOutlet UIToolbar *navigationBar;
//test
@property(nonatomic, retain) NSString *message;
//end test
@property (nonatomic, retain) id <FirstDetailViewControllerDelegate> delegate;
@end
我知道我需要将#import
替换为@class
,但我是否会为这两种情况都这样做?另外,我在RootViewController.m文件中已经#import "FirstDetailViewController.h"
,所以我也在那里切换它吗?
我有点困惑,所以任何帮助将不胜感激!
答案 0 :(得分:1)
前向声明将是解决方案,如果它只是您需要的指针,但您正在每个类中实现其他标头的协议。
我的建议是将您的协议声明在其他一些头文件中,例如MyProtocols.h
,并将其包含在您的两个.h文件中,而不是包含在控制器的头文件中。
另一方面,对一个代表的强烈或保留的引用并不是真正的标准做法,因为这很容易导致保留周期导致内存泄露
答案 1 :(得分:1)
替换
#import "FirstDetailViewController.h"
与
@class FirstDetailViewController;
替换
#import "RootViewController.h"
@class RootViewController;
,确保你有
#import "RootViewController.h"
#import "FirstDetailViewController.h"
确保你有
#import "FirstDetailViewController.h"
#import "RootViewController.h"
编辑:哎呀错过了协议参考... Dan F的答案是正确的