代码之家  ›  专栏  ›  技术社区  ›  Stephen Darlington

具有可选属性的协议?

  •  1
  • Stephen Darlington  · 技术社区  · 16 年前

    简而言之,我有一个协议,它有一个可选参数。当我构建一个用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上,协议可能不包括可选的声明属性。”显然,这里的情况并非如此。

    这是一个快速的代码示例,如果我不完全清楚,我必须让事情变得更加明显。

    @protocol MyProtocol
      @required
        - (void) method:(NSString*)param;
      @optional
        @property (nonatomic,retain) NSString* field;
    @end
    
    @interface MyClass : NSObject<MyProtocol> {
    }
    - (void) method:(NSString*)param;
    @end
    
    3 回复  |  直到 16 年前
        1
  •  3
  •   Chuck    16 年前

    iPhone SDK与Mac OS X的任何版本都不完全相同。显然,SDK 3中包含了一个更新版本的工具集,与Snow Leopard中的工具集更相似。

        2
  •  1
  •   Peter N Lewis    16 年前

    @动态场;

    您的实施。这告诉编译器,您将动态地提供实现,但您不会这样做,因为这是一个可选属性,但这应该会关闭编译器。

        3
  •  0
  •   AlBlue RACGAMERUP    16 年前

    @optional是在Objective-C 2.0中引入的,因此它不适用于旧版本的SDK。你最好的办法是确定它是否应该存在(可能不存在),然后用#ifdef来定义它

    #if __OBJC2__
    @optional
    @property ...
    #endif
    

    然后,它应该只在OBJC2下编译,它不会作为协议本身的一部分出现在旧系统中。