即使使用@protocol,Xcode也会警告缺少协议定义

时间:2012-04-03 10:09:00

标签: objective-c xcode protocols forward-declaration

由于我最近有一个导入周期,我将所有#import语句(关于我自己的文件)从标题移动到相应的.m文件中。我还添加了@class@protocol前向声明来缓和编译器。但是,我仍然听到他的警告:

Cannot find the protocol definition for 'MyCustomDelegate'.

正如我所说,在@protocol MyCustomDelegate - Block中使用它之前有一个@interface。有趣的是,只有在另一个文件(其标题在.m - 文件中导入)中声明了相应的委托时,才会出现此警告。

我读到一个解决方案是在单独的头文件中声明委托,并直接在实现委托的类的头中导入该文件。这真的是要走的路吗?还有其他解决方案吗?我认为那些代表已经充分夸大了我们的代码,现在我应该继续甚至为它声明一个自己的文件?

小样本代码可以更好地说明问题:

NewFooController.h

#import <UIKit/UIKit.h>

@protocol NewFooControllerDelegate;

@interface NewFooController : UITableViewController
  @property (nonatomic, weak) id<NewFooControllerDelegate> delegate;
@end

@protocol NewFooControllerDelegate
@end

HomeTableViewController.h

#import <UIKit/UIKit.h>
@protocol NewFooControllerDelegate;

// warning points to line below
@interface HomeTableViewController : UITableViewController <NewFooControllerDelegate>
@end

HomeTableViewController.m

#import "HomeTableViewController.h"
#import "NewFooController.h"
@implementation HomeTableViewController
@end

2 个答案:

答案 0 :(得分:-1)

HomeTableViewController.h引用协议,但尚未声明。 如果在HomeTableViewController.h中尝试使用它之前导入NewTaskController.h,它应该可以解决您的问题。

当然,您可以从HomeTableViewController.m

中删除导入

答案 1 :(得分:-1)

不确定这是否是“最佳方式”,但尝试在类头文件之前实现协议的类的导入头。

HomeTableViewController.m

#import "NewFooController.h"
#import "HomeTableViewController.h"

@implementation HomeTableViewController
@end

您可以删除HomeTableViewController.h中的协议声明

#import <UIKit/UIKit.h>

@interface HomeTableViewController : UITableViewController <NewFooControllerDelegate>
@end