1

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

3 回答 3

3

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

于 2009-08-12T21:19:19.627 回答
1

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

@动态字段;

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

于 2009-08-13T02:52:17.913 回答
0

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

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

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

于 2009-08-12T20:41:13.900 回答