【问题标题】:Xcode warns about missing protocol definition, even though @protocol is usedXcode 警告缺少协议定义,即使使用了@protocol
【发布时间】:2012-04-16 23:34:07
【问题描述】:

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

Cannot find the protocol definition for 'MyCustomDelegate'.

正如我所说,在@interface-Block 中使用它之前,有一个@protocol MyCustomDelegate。有趣的是,只有在另一个文件中声明了相应的委托(其标头在 .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

【问题讨论】:

  • 在哪里导入 NewFooController.h?
  • 抱歉,我复制并粘贴了部分代码。 ;) 我将#import "NewTaskController.h" 更改为#import "NewFooController.h

标签: objective-c xcode protocols forward-declaration


【解决方案1】:

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

当然你可以从 HomeTableViewController.m 中删除导入

【讨论】:

  • 我知道它没有被声明,并且我知道在标题中导入它可以解决问题。但是,我将导入从标题移动到.m-文件的原因是导入循环。所以我需要一个解决方案来消除警告并且不能导致导入周期。正如我发布的那样,一个可行的选择是将协议声明写入单独的文件。我只是想知道是否有更多适合我需要的解决方案。
  • @FlorianPilz,有什么更新吗?我也有同样的问题。
【解决方案2】:

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

HomeTableViewController.m

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

@implementation HomeTableViewController
@end

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

#import <UIKit/UIKit.h>

@interface HomeTableViewController : UITableViewController <NewFooControllerDelegate>
@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多