这个objective-c属性综合警告意味着什么?

dpa*_*age 17 xcode objective-c

自升级到Xcode 5.1以来,我开始在我的项目使用的某些代码中看到以下警告.我想弄清楚它意味着什么.

警告: Auto property synthesis will not synthesize property 'responseHeader' because it is 'readwrite' but it will be synthesized 'readonly' via another property

它出现的代码,在.m文件中:

@interface S3Response ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
Run Code Online (Sandbox Code Playgroud)

先前声明的属性,在.h文件中:

@property (nonatomic, readonly) NSDictionary *responseHeader;
Run Code Online (Sandbox Code Playgroud)

@synthesize该属性没有声明,也没有responseHeadersetResponseHeader定义为方法.然而,有一个名为ivar的明确定义responseHeader.

对我来说似乎很简单:对于类的用户,属性被声明为只读,但是本地读写,因此类可以设置它.

这个警告意味着什么,我应该怎么做呢?

Mar*_*n R 24

该代码似乎来自AWS SDK for iOS,并且S3Response是其子类AmazonServiceResponse.

公共AmazonServiceResponse接口定义了只读属性

@interface AmazonServiceResponse:NSObject
// ...
@property (nonatomic, readonly) NSDictionary *responseHeader;
@end
Run Code Online (Sandbox Code Playgroud)

在实现文件的类扩展中重新定义为读写:

@interface AmazonServiceResponse ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
Run Code Online (Sandbox Code Playgroud)

现在子类 S3Response还希望对此属性进行读写访问,因此也在其实现文件的类扩展中定义:

@interface S3Response ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
Run Code Online (Sandbox Code Playgroud)

编译器抱怨因为 - 在编译"S3Response.m"时 - 它不知道超类中存在属性的setter(它在那时不读取超类的实现文件).此外,编译器不能简单地在子类中合成一个setter,因为它不能不知道该属性是由超类中的实例变量备份的.

但是你知道会生成一个setter,所以你可以通过向@dynamic子类实现添加一个声明来删除警告:

@implementation S3Response
@dynamic responseHeader;
...
Run Code Online (Sandbox Code Playgroud)

@dynamic 是对编译器的"承诺",即所有必需的访问器方法在运行时都可用.