错误:可写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; }