【问题标题】:What does this mean? "Writable atomic property 'fileManager' cannot pair a synthesized setter/getter with a user defined setter/getter" [duplicate]这是什么意思? “可写原子属性'fileManager'无法将合成的setter/getter与用户定义的setter/getter配对”[重复]
【发布时间】:2011-12-08 16:55:43
【问题描述】:

可能重复:
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 年那样覆盖合成的 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


【解决方案1】:

如果你声明一个原子的@property——默认值——你必须要么使用@dynamic,要么让编译器@synthesize一切,或者提供setter和getter的实现。

【讨论】:

  • 是的,看起来你是对的。但老实说:我希望你不是:-)
  • 他是。不喜欢这样的是新的 LLVM 编译器。
【解决方案2】:

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

@synthesize fileManager = _fileManager;

然后你懒惰地创建了局部变量。

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

【讨论】:

  • 很好,但这如何解决我上面描述的问题?我已经在使用延迟初始化,在这个例子中它甚至不是线程安全的,不是吗?或者这是我没有得到的一些高级哈佛巫术? ;-)
  • 您仍然收到警告?
猜你喜欢
  • 2023-03-29
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多