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

时间:2011-04-27 00:43:43

标签: objective-c protocols

我正在查看Apple的lazy table image loading示例代码。我看到他们有两行以@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

1 个答案:

答案 0 :(得分:6)

@protocol ParseOperationDelegate;行没有定义协议。这是前向声明。基本上它是说“一个名为ParseOperationDelegate的协议存在,并在代码中的其他地方定义”。

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

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