【发布时间】:2011-12-08 16:55:43
【问题描述】:
我有一个头文件,我在其中声明了一个原子属性,如下所示:
@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 警告:
可写原子属性“fileManager”无法配对合成 带有用户定义的 setter/getter 的 setter/getter
当我做对时,它试图说:“你不能像过去 3 年那样覆盖合成的 getter/setter,即使它工作得很好!”
明显地压制警告是愚蠢的。这个属性真的需要是线程安全的,我真的很想要这个懒惰的初始化。我现在该怎么办?
编辑:根据this question and answer on SO,这里缺少@synchronize 代码。 如何手动使此访问器正确地线程安全?
我尝试将其重写为:
- (FileManager*)fileManager {
@synchronized(self) {
if (fileManager) {
return fileManager;
}
FileManager *fm = [[FileManager alloc] init];
self.fileManager = fm;
[fm release];
return fileManager;
}
}
但警告并没有消失。因此,当我得到另一个问题的正确答案时,摆脱此警告的唯一方法是要么不自定义合成原子属性访问器,要么完全省略 @synthesize 并手动完成所有操作:访问器和增变器。当然,这会很糟糕。有没有更好的解决方案?
如果我将其设置为@dynamic fileManager 而不是@synthesize fileManager,这意味着什么?
编辑:所以我尝试使用@dynamic 而不是@synthesize。这实际上意味着手动实现访问器和修改器。那我为什么还要声明为@dynamic呢?
【问题讨论】:
-
'Harvard Voodoo' 说原子性!= 线程安全
标签: objective-c ios xcode xcode4