Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个objective-c属性合成警告是什么意思?_Objective C_Xcode - Fatal编程技术网

这个objective-c属性合成警告是什么意思?

这个objective-c属性合成警告是什么意思?,objective-c,xcode,Objective C,Xcode,自从升级到Xcode 5.1之后,我开始在我的项目使用的一些代码中看到以下警告。我想弄明白这是什么意思 警告:自动属性合成不会合成属性“responseHeader”,因为它是“readwrite”,但它将通过另一个属性合成为“readonly” 发生在.m文件中的代码: @interface S3Response () @property (nonatomic, readwrite, retain) NSDictionary *responseHeader; @end .h文件中以前的属性声

自从升级到Xcode 5.1之后,我开始在我的项目使用的一些代码中看到以下警告。我想弄明白这是什么意思

警告:
自动属性合成不会合成属性“responseHeader”,因为它是“readwrite”,但它将通过另一个属性合成为“readonly”

发生在.m文件中的代码:

@interface S3Response ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
.h文件中以前的属性声明:

@property (nonatomic, readonly) NSDictionary *responseHeader;
该属性没有
@synthesis
语句,也没有将
responseHeader
setResponseHeader
定义为方法。但是,有一个名为
responseHeader
的ivar的明确定义

对我来说似乎非常简单:属性对于类的用户声明为只读,但在本地读写,以便类可以设置它


这个警告是什么意思?我应该怎么做

这里的问题如下

默认情况下,如果不显式写入所有权(弱/保留/强/分配),xCode将自动检查类型。因此,在NSD的情况下,它将是强大的。因此,在界面中,您将

@property (nonatomic, readonly, strong) NSDictionary *responseHeader;
那么它将与您的私有实现定义相矛盾

@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
编译器不匹配strong并保留under属性,尽管它在形式上是相同的


为了解决这种情况,您可以在这两种情况下都写retain,或者更正确地说,您根本不应该写retain。默认情况下,这两个定义都会很强。

该代码似乎来自, 而
S3Response
AmazonServiceResponse
的一个子类

public
AmazonServiceResponse
接口定义了一个只读属性

@interface AmazonServiceResponse:NSObject
// ...
@property (nonatomic, readonly) NSDictionary *responseHeader;
@end
在实现文件的类扩展名中重新定义为读写:

@interface AmazonServiceResponse ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
@interface S3Response ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
现在子类
S3Response
也希望对该属性进行读写访问, 因此也在其实现文件的类扩展名中定义:

@interface AmazonServiceResponse ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
@interface S3Response ()
@property (nonatomic, readwrite, retain) NSDictionary *responseHeader;
@end
编译器抱怨,因为在编译“S3Response.m”时,它不知道 属性的setter存在于超类中(它不读取 此时超类的实现文件)。此外,编译器不能 只需在子类中合成一个setter,因为它不能知道 属性由超类中的实例变量备份

但是您知道将生成一个setter,因此您可以通过 将
@dynamic
声明添加到子类实现中:

@implementation S3Response
@dynamic responseHeader;
...
@dynamic
是对编译器的“承诺”,所有必要的访问器方法都将
运行时可用。

尝试将标题定义更改为
(非原子、只读、保留)
。这不会修复警告。这也不能帮助我理解警告的含义。:)你在子类化什么类?那有一个
responseHeader
属性吗?@JoshCaswell,没有。修改了这个问题以澄清。@Kevin,它是
NSObject
的子类化。然而,我确实发现了一个名为
responseHeader
的ivar的明确声明;修正了问题。
strong
retain
是等效的,因此如果这是真的,应该将其视为bug。(尽管编译器关于不匹配的迂腐警告可能是合适的。)从所有权的角度来看,这是正确的。但似乎ARC的一些自动机制出于某种原因将它们区分开来。“strong”和“retain”是完全的同义词,可以在不引起任何警告的情况下混合使用。果然,这解决了这个问题。还有一点是要弄清楚我说的到底是什么代码:)不过,这是一条非常糟糕的警告消息。在Xcode6中,它不起作用,你需要遵循以下步骤:@Jacky:你能澄清一下你的说法吗?我刚刚用Xcode 6 beta 4和AWS SDK for iOS v1.7.1验证了我建议的解决方案仍然修复了编译器警告。添加
@dynamic…
也建议在您链接到的问题的答案中添加。-感谢您的反馈!