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

具有可选属性的协议?

  •  0
  • Stephen Darlington  · 技术社区  · 15 年前

    简短的版本是,我有一个协议,它有一个可选参数。当我用iPhoneSDK3.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 回复  |  直到 15 年前
        1
  •  3
  •   Chuck    15 年前

    iPhone SDK与Mac OS X的任何特定版本都不完全相同。显然,SDK 3中包含了更新版本的工具集,与雪豹的工具集更为相似。

        2
  •  1
  •   Peter N Lewis    15 年前

    删除警告的简单方法是添加

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

        3
  •  0
  •   AlBlue RACGAMERUP    15 年前

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

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