为什么协议在Apple的示例代码中定义了两次?

JoJ*_*oJo 1 protocols objective-c

我正在查看Apple的懒惰表图像加载示例代码.我看到他们有两行开头@protocol ParseOperationDelegate.为什么他们两次这样做?我看过的关于Objective C协议的所有文档并没有告诉你两次这样做.

@class AppRecord;

@protocol ParseOperationDelegate;

//@interface ParseOperation : NSOperation <NSXMLParserDelegate>
@interface ParseOperation : NSOperation
{
@private
    id <ParseOperationDelegate> delegate;

    NSData          *dataToParse;

    NSMutableArray  *workingArray;
    //AppRecord       *workingEntry;
    //NSMutableString *workingPropertyString;
    //NSArray         *elementsToParse;
    //BOOL            storingCharacterData;
}

- (id)initWithData:(NSData *)data delegate:(id <ParseOperationDelegate>)theDelegate;

@end

@protocol ParseOperationDelegate
- (void)didFinishParsing:(NSArray *)appList;
- (void)parseErrorOccurred:(NSError *)error;
@end
Run Code Online (Sandbox Code Playgroud)

aro*_*oth 6

@protocol ParseOperationDelegate;行未定义协议.这是一个前瞻性声明.基本上它是说"一个叫做ParseOperationDelegate存在的协议,并在代码中的其他地方定义".

他们这样做是为了让编译器不会因为线路上的错误而死亡id <ParseOperationDelegate> delegate;.另一种方法是将整个协议定义放在接口定义之前(我认为在这种情况下我认为这是一个更好的解决方案).

在这个简单的案例中,我认为提出前瞻性声明没有多大意义.但是您可以轻松地想象一个更复杂的情况,即协议定义可能存在于其自己的头文件中(或者在其他类的头文件中).在这种情况下,使用前向声明可以避免#import将协议的头文件放入类的标题中.这确实是一个小小的差异,但它可能很有用.