这是什么意思?"可写原子属性'fileManager'不能将合成的setter/getter与用户定义的setter/getter配对"

ope*_*rog 2 xcode objective-c ios xcode4

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

我有一个头文件,我在其中声明一个原子属性,如下所示:

@property (retain) FileManager *fileManager;
Run Code Online (Sandbox Code Playgroud)

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

@synthesize fileManager;
Run Code Online (Sandbox Code Playgroud)

然后我为懒惰初始化编写自己的访问器:

- (FileManager*)fileManager {
    if (fileManager) {
        return fileManager;
    }

    FileManager *fm = [[FileManager alloc] init];
    self.fileManager = fm;
    [fm release];

    return fileManager;
}
Run Code Online (Sandbox Code Playgroud)

一切都很完美,Xcode 3.2从不抱怨.但是Xcode 4警告说:

可写原子属性'fileManager'不能将合成的setter/getter与用户定义的setter/getter配对

当我做到这一点时,它试图说:"你不能像过去3年那样覆盖合成的吸气剂/定位器,即使它工作得很好!"

显然压抑警告是愚蠢的.这个属性确实需要是线程安全的,我真的想要这个懒惰的初始化.我现在该怎么办?

编辑:根据这个问题和答案SO,@synchronize这里缺少代码.如何手动使这个存取器正确地线程安全?

我尝试将其重写为:

- (FileManager*)fileManager {
    @synchronized(self) {
        if (fileManager) {
            return fileManager;
        }

        FileManager *fm = [[FileManager alloc] init];
        self.fileManager = fm;
        [fm release];


        return fileManager;
    }
}
Run Code Online (Sandbox Code Playgroud)

但警告并没有消失.因此,当我得到另一个问题的答案时,摆脱这个警告的唯一方法是不要自定义合成的原子属性访问器或完全省略@synthesize并手动完成:访问器和mutator.当然,这会很糟糕.有没有更好的解决方案?

如果我把它设置为@dynamic fileManager而不是什么意思@synthesize fileManager?

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

Kir*_*odd 5

如果你声明一个原子的@property - 默认 - 你必须使用@dynamic,让编译器@synthesize所有东西或者提供setter和getter的实现.