简短版本是我有一个具有可选参数的协议。当我构建一个用iPhone SDK 3.x实现它的类时,它编译得很好,没有错误或警告。当我使用2.x SDK时,我收到以下警告:
Class.m:68: warning: property 'field' requires method '-field' to be defined - use @synthesize, @dynamic or provide a method implementation
在这两种情况下都可以正常工作。
所以有两个问题:
@dynamic
,这实际上并不正确,因为该属性确实不存在。这里有一个代码类型的快速示例,如果我不完全清楚,我必须让事情变得更加明显。
@protocol MyProtocol
@required
- (void) method:(NSString*)param;
@optional
@property (nonatomic,retain) NSString* field;
@end
@interface MyClass : NSObject<MyProtocol> {
}
- (void) method:(NSString*)param;
@end
答案 0 :(得分:3)
iPhone SDK与任何特定版本的Mac OS X都不完全相同。显然,SDK 3中包含的新版工具集与Snow Leopard中的版本更相似。
答案 1 :(得分:1)
删除警告的简单方法是添加
@dynamic field;
到您的实施。这告诉编译器你将动态地提供实现,你不会,因为它是一个可选属性,但是应该关闭编译器。
答案 2 :(得分:0)
@optional是在Objective-C 2.0中引入的,因此它不适用于旧版本的SDK。你最好的办法是确定它是否应该存在(可能不存在),然后#ifdef与
一起存在#if __OBJC2__
@optional
@property ...
#endif
然后它应该只在OBJC2下编译,并且它不会作为协议本身的一部分出现在旧系统中。