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

时间:2011-10-16 11:59:33

标签: objective-c ios xcode xcode4

  

可能重复:
  error: writable atomic property cannot pair a synthesized setter/getter with a user defined setter/getter

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

@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年那样覆盖合成的吸气剂/定型器,即使它工作得很好!”

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

修改:根据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并手动完成:访问器和mutator。当然,这会很糟糕。这个问题有更好的解决方案吗?

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

修改:所以我尝试使用@dynamic代替@synthesize。它实际上意味着手动实现accessor和mutator。那为什么我甚至想要将它声明为@dynamic

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

您可以在过去几年中使用许多Apple代码示例中说明的延迟初始化模式。通常有一个相应的局部变量,按照惯例使用前导下划线(_)。在@synthesize语句中,将其分配给ivar:

@synthesize fileManager = _fileManager;

你懒洋洋地创建了局部变量。

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