这是什么意思? “可写入的primefaces属性”fileManager“不能将合成的setter / getter与用户定义的setter / getter配对”

可能重复:
错误:可写primefaces属性无法将合成的setter / getter与用户定义的setter / getter配对

我有一个头文件,我声明一个primefaces属性,像这样:

@property (retain) FileManager *fileManager; 

然后我在实现文件中综合:

 @synthesize fileManager; 

然后我编写自己的访问器进行延迟初始化:

 - (FileManager*)fileManager { if (fileManager) { return fileManager; } FileManager *fm = [[FileManager alloc] init]; self.fileManager = fm; [fm release]; return fileManager; } 

一切正常,Xcode 3.2从不抱怨。 但Xcode 4警告:

可写入的primefaces属性'fileManager'不能将一个合成的setter / getter与一个用户定义的setter / getter配对

当我得到正确的答案时,它试图说:“过去3年你不能像你一样覆盖合成的获得者/定位者,即使它完美无缺!”

显而易见的警告是愚蠢的。 这个属性真的需要线程安全,我真的想要这个懒惰的初始化。 我现在该怎么办?

编辑:根据这个问题和答案 ,在这里@synchronize代码是缺less的。 我怎样才能使这个访问器正确的线程安全?

我试图重写它:

 - (FileManager*)fileManager { @synchronized(self) { if (fileManager) { return fileManager; } FileManager *fm = [[FileManager alloc] init]; self.fileManager = fm; [fm release]; return fileManager; } } 

但是警告不会消失。 所以当我正确地得到其他问题的答案的时候,摆脱这个警告的唯一方法是要么不自定义合成的primefaces属性访问器,要么完全省略@synthesize,并且手工完成:访问器和增变器。 当然,这会吸引。 有没有更好的解决scheme?

如果我将它设置为@dynamic fileManager而不是@synthesize fileManager ,这意味着什么?

编辑:所以我尝试使用@dynamic而不是@synthesize 。 这实际上意味着手动实现accessor和mutator。 那为什么我甚至想把它声明为@dynamic呢?

如果你声明了一个@property,它是默认的 – 你必须使用@dynamic,让编译器@把所有东西都整合起来,或者提供setter和getter的实现。

在过去几年里,许多Apple代码示例中都可以使用该模式进行延迟初始化。 通常有一个对应的局部variables,按照惯例带有下划线( _ )。 在@synthesize声明中,您将其分配给伊娃:

 @synthesize fileManager = _fileManager; 

你懒洋洋地创build本地variables。

 -(FileManager) fileManager { if (_fileManager != nil) return _fileManager; // etc... }