我最近尝试编译一个旧的 Xcode 项目(以前编译得很好),现在我看到很多这种形式的错误:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
导致这些错误的代码模式总是如下所示:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
我可以明白为什么会产生错误。我告诉编译器合成我的属性访问器(getter 和 setter),然后立即手动重写 setter。这段代码总是有点不对劲。
那么,执行此操作的正确方法是什么?如果我使用@dynamic
代替@synthesize
,我也必须写吸气剂。这是唯一的方法吗?
我遇到了同样的问题,经过一番研究后,我对此问题的结论如下:
编译器会警告您@property
您声明为原子的(即通过省略nonatomic
关键字),但您提供了如何同步对该属性的访问的不完整实现。
要使该警告消失:
如果你声明一个@property
要成为原子,则执行以下操作之一:
- use
@dynamic
or;
- use
@synthesize
并保留合成的 setter 和 getter 或者;
- 提供手动实施bothsetter 和 getter(不使用上述指令之一)。
如果您声明@property
with (nonatomic)
然后您可以混合 getter 和 setter 的手动和综合实现。
更新:关于属性自动合成的说明
从 LLVM 4.0 开始,CLang 为声明的属性提供自动合成,这些属性不是@dynamic
。默认情况下,即使您省略@synthesize
,编译器会为你提供getter和setter方法。然而,原子属性的规则仍然是相同的:要么让编译器提供bothgetter 和 setter,或者实现它们both你自己!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)