gpt4 book ai didi

objective-c - 错误 : writable atomic property cannot pair a synthesized setter/getter with a user defined setter/getter

转载 作者:IT老高 更新时间:2023-10-28 12:19:18 26 4
gpt4 key购买 nike

我最近尝试编译一个较旧的 Xcode 项目(以前编译得很好),现在我看到了很多这种形式的错误:

error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter

导致这些错误的代码模式总是如下所示:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}

我知道为什么会产生错误。我告诉编译器合成我的属性访问器(getter 和 setter),然后立即手动覆盖 setter。那个代码总是有点不对劲。

那么,这样做的正确方法是什么?如果我使用 @dynamic 而不是 @synthesize,我也必须编写 getter。这是唯一的方法吗?

最佳答案

我也遇到了同样的问题,经过一番研究,我对这个问题的结论如下:

编译器会警告您声明为原子的 @property(即通过省略 nonatomic 关键字),但您提供的如何同步访问的不完整实现到那个属性。

要使该警告消失:

如果您将 @property 声明为原子,则执行以下操作之一:

  • 使用 @dynamic 或;
  • 使用 @synthesize 并保留合成的 setter 和 getter 或;
  • 提供两个 setter 和 getter 的手动实现(不使用上述指令之一)。

如果您使用 (nonatomic) 声明 @property,那么您可以混合使用手动和合成的 getter 和 setter 实现。

更新:关于属性自动合成的说明

从 LLVM 4.0 开始,CLang 为非 @dynamic 声明的属性提供自动综合。默认情况下,即使您省略了 @synthesize,编译器也会为您提供 getter 和 setter 方法。然而,原子属性的规则还是一样的:要么让编译器同时提供 getter 和 setter,要么自己实现它们both!

关于objective-c - 错误 : writable atomic property cannot pair a synthesized setter/getter with a user defined setter/getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3227176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com