这是什么意思? “可写入的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... }