【问题标题】:Property is assumed atomic by default默认情况下假定属性是原子的
【发布时间】:2012-01-07 12:00:14
【问题描述】:

我正试图摆脱 CLANG/LLVM 3.0 给我的恼人警告。我在我的对象中设置了以下 ivar:

bool preloaded;

以及以下属性声明:

@property(readonly) bool preloaded;

以及下面的合成调用:

@synthesize preloaded;

就目前而言,编译器抱怨:

属性默认是原子的

如果我更改属性声明以添加“原子”:

@property(atomic,readonly) bool preloaded;

它也抱怨这一点:

错误:在“原子”之前需要一个属性属性

所以看来,如果我这样做,我会被诅咒,如果我不这样做,我会被诅咒......我错过了什么吗?

【问题讨论】:

  • 好吧,atomic 不是一个有效的属性关键字,所以第二位导致错误是有道理的。不过,不知道第一个。
  • 是的,这就是我的想法,但是看到 Xcode 语法如何突出显示“原子”,我想他们可能会将其添加为有效的属性关键字。
  • 我试过@property (atomic,readonly) bool preloaded;,它编译得很好。它也删除了警告。我正在使用 Xcode 4.2.1。
  • 关键字“atomic”在某些情况下有效,但在其他情况下无效。我无法隔离方式和位置,但在某些情况下,它会很好地编译模块,但如果另一个模块引用头文件,则会失败。如果我把失败的属性复制到一个新的类中,它突然又可以正常编译了。这真的开始看起来像 LLVM 中的一个错误。

标签: objective-c properties compiler-errors llvm compiler-warnings


【解决方案1】:

您的项目设置中似乎启用了 Implicit Atomic Objective-C 属性 LLVM 编译器警告。关闭此功能将删除警告。

如上所述,atomic 不是一个有效的关键字,它只是暗示了nonatomic 的缺失。来自 Apple 的Declared Properties documentation

您可以使用此属性来指定访问器方法不是原子的。 (没有关键字来表示原子。)

【讨论】:

  • 我会将其标记为“正确”,因为禁用该设置会消除警告,但我仍然对为什么将这些属性标记为开头感到困惑。它是 LLVM 中的错误吗?如果我可以启用所有警告,我会更开心...
  • 警告不仅仅是满足编译器的游戏,它们还提醒开发人员在编程时注意某些行为。要保持警告启用但禁用此实例,请参阅 Clang 文档中的 Controlling Static Analyzer Diagnostics
  • 太棒了!这就像一个魅力!我现在可以编译除 pedantic 之外的所有警告(由于我使用 ##__VA_ARGS__ 进行日志记录)
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2012-02-29
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
相关资源
最近更新 更多