错误:可写primefaces属性无法将合成的setter / getter与用户定义的setter / getter配对
我最近试图编译一个旧的Xcode项目(用于编译就好了),现在我看到很多这种forms的错误:
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
,那么我也必须写getter。 这是唯一的方法吗?
我也遇到了同样的问题,经过一番研究,下面是关于这个问题的结论:
编译器会警告你关于你声明为primefaces的nonatomic
(即通过省略nonatomic
关键字),但是你提供了一个不完整的实现,如何同步对这个属性的访问。
为了使这个警告消失:
如果你声明一个@property
是primefaces的,那么执行以下操作之一:
- 使用
@dynamic
或; - 使用
@synthesize
并保留合成的setter和getter; - 提供setter和getter的手动实现(不使用上面的指令之一)。
如果你声明@property
(nonatomic)
那么你可以混合使用getter和setter的手动和合成实现。
更新:关于属性自动合成的注意事项
从LLVM 4.0开始,CLang为不是@dynamic
声明属性提供了自动合成。 默认情况下,即使你忽略了@synthesize
,编译器也会为你提供getter和setter方法。 然而,primefaces属性的规则仍然是一样的:让编译器同时提供getter和setter,或者自己实现它们!
这个问题,你从search“目标C自定义属性”获得的其他顶级命中,不会更新有关“setter =”或“getter =”的信息。
所以,要提供更多关于这个问题的信息:
您可以通过编写自己的方法来提供@property调用
@property(setter = MySetterMethod:, getter = MyGetterMethod)
注意提供的setter方法的冒号。
参考Apple文档
编辑:我不太清楚Objective-C的属性(他们现在更聪明)的新变化如何改变这个问题的答案。 也许它应该都被标记为过期。
你也需要实现getter。 例:
// Interface: @property (retain) NSObject * someProperty; // Implementation: - (void)setSomeProperty:(NSObject *)newValue { @synchronized (self) { // ... } } - (NSObject *)someProperty { NSObject *ret = nil; @synchronized (self) { ret = [[someProperty retain] autorelease]; } return ret; }