我正在查看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
答案 0 :(得分:6)
@protocol ParseOperationDelegate;
行没有定义协议。这是前向声明。基本上它是说“一个名为ParseOperationDelegate
的协议存在,并在代码中的其他地方定义”。
他们这样做是为了让编译器不会因id <ParseOperationDelegate> delegate;
行而出错。另一种方法是将整个协议定义放在接口定义之前(我认为在这种情况下我认为这是一个更好的解决方案)。
在这样一个简单的案例中,我认为提出前瞻性声明毫无意义。但是您可以轻松地想象一个更复杂的情况,即协议定义可能存在于其自己的头文件中(或者在其他类的头文件中)。在这种情况下,使用前向声明可以避免将#import
协议的头文件放入类的标头中。这确实是一个很小的差异,但它可能很有用。