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
该属性没有声明,也没有responseHeader
或setResponseHeader
定义为方法.然而,有一个名为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
是对编译器的"承诺",即所有必需的访问器方法在运行时都可用.
归档时间: |
|
查看次数: |
10878 次 |
最近记录: |