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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (56)

最近,我尝试编译一个旧的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(不使用上述指令之一)。

如果您声明@property带着(nonatomic)然后,可以混合手工实现和综合实现的getter和setter。

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

从llvm4.0开始,clang为声明的属性提供了自动合成功能,而这些属性不是@dynamic。默认情况下,即使忽略了@synthesize,编译器将为提供getter和setter方法。但是,原子属性的规则仍然相同:要么让编译器提供getter和setter。

用户回答回答于

这个问题是搜索“ObjectC自定义属性”时获得的其他最热门的问题之一,但没有更新有关“setter=”或“getter=”的信息。

因此,就这个问题提供更多信息:

可以使用自己的方法提供@Property调用,方法是编写

    @property(setter = MySetterMethod:, getter = MyGetterMethod)

请注意所提供的setter方法的冒号。

扫码关注云+社区