【问题标题】:Writable atomic property 'result' cannot pair a synthesized setter/getter with a user defined setter/getter [duplicate]可写原子属性“结果”无法将合成的 setter/getter 与用户定义的 setter/getter 配对 [重复]
【发布时间】:2023-03-29 05:49:01
【问题描述】:

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

我收到以下警告:可写原子属性“结果”无法将合成的 setter/getter 与用户定义的 setter/getter 配对

这就是我设置/获取它的方式:

@property (retain, getter=getResult) NSString *result;
@synthesize result;

我在下面的粗体/斜体行中收到警告:

***- (NSString *)getResult***
{
    if (result == nil)
        self.result = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    return result;
}

关于如何解决它的任何想法?

谢谢!

【问题讨论】:

  • Getter 方法在 Objective-C 中不应以 get... 开头; get... 方法通常将值写入其参数。此外,KVC 不适用于非标准的 getter 方法。
  • 查看您最近的问题,我强烈建议您阅读Coding Guidelines for Cocoa 以了解一些平台命名约定。

标签: ios warnings atomic


【解决方案1】:

当您为 setter 设置 @property 时,编译器将自动生成一个名称为 getResult 的 setter(虽然您看不到它)。因此,当您自己制作 setter 时,编译器会警告您它已经为您完成了该操作。但这不会导致任何功能问题,因为正如您可能在断点中看到的那样,仍然会调用此代码。因此,您可以删除用于在 @property 中创建 setter 的代码,也可以创建一个不具有相同名称且不采用与默认 setter 相同参数的 setter,然后自己调用它,例如

- (NSString *)getResult(id data){}

【讨论】:

    【解决方案2】:

    合成 atomic property 会生成一个 getter 和 setter,它们使用锁来确保在多线程环境中始终完全检索或设置值。

    要么将您的属性声明更改为:

    @property (nonatomic, retain) NSString *result;
    

    或者你自己定义两个访问器并实现你自己的锁定机制来保证原子性。

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多