具有可选属性的协议?

时间:2009-08-12 20:22:35

标签: objective-c iphone properties compiler-warnings

简短版本是我有一个具有可选参数的协议。当我构建一个用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

在这两种情况下都可以正常工作。

所以有两个问题:

  1. 修正警告的正确方法是什么?我在实现中添加了@dynamic,这实际上并不正确,因为该属性确实不存在。
  2. 为什么在SDK 3.x中工作但不在2.x中工作?文档说“在Mac OS X v10.5上,协议可能不包含可选的声明属性。”显然,情况并非如此。
  3. 这里有一个代码类型的快速示例,如果我不完全清楚,我必须让事情变得更加明显。

    @protocol MyProtocol
      @required
        - (void) method:(NSString*)param;
      @optional
        @property (nonatomic,retain) NSString* field;
    @end
    
    @interface MyClass : NSObject<MyProtocol> {
    }
    - (void) method:(NSString*)param;
    @end
    

3 个答案:

答案 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下编译,并且它不会作为协议本身的一部分出现在旧系统中。