【问题标题】:Why are Cocoa's IBOutlet properties atomic by default, and Cocoa Touch's aren't?为什么 Cocoa 的 IBOutlet 属性默认是原子的,而 Cocoa Touch 的不是?
【发布时间】:2013-02-28 00:30:09
【问题描述】:

如果你从 Interface Builder 拖一个新的 outlet 到一个接口(头)文件,Xcode 4.6 会自动为你创建一个属性...

在 iOS (Cocoa Touch) 上,它看起来像这样:

@property (weak, nonatomic) SomeClass *someProperty; //nonatomic accessors

而在 OS X (Cocoa) 上它看起来像这样:

@property (weak) SomeClass *someProperty; //atomic accessors (implicitly)

为什么?

编辑:我不是在问 atomic 做什么或不做什么,我很清楚同步指令和保证原子性的底层互斥锁(或锁或其他)设置器和获取器。我知道在 iOS 上,访问器是非原子的,因为 UIKit 不是线程安全的,因此使它们成为原子没有任何好处,这只是浪费处理器时间和电池寿命。我在这里谈论的是默认情况,知道自己在做什么的程序员会知道何时需要使访问器原子化。

所以我问为什么它们在 OS X 上默认是原子的。我的印象是 Appkit 也不是线程安全的。并且拥有原子访问器并不能保证线程安全,我什至可以说它是相反的,因为它可以给新手程序员带来线程安全的错觉,并通过延迟崩溃使并发应用程序中的错误跟踪更加困难到以后的时间,这样做使它们更难追踪。并且仅仅因为台式机相对强大并不意味着资源应该被浪费(注意我这里不是在谈论过早的优化),而且既然苹果工程师是合理的程序员,那么他们必须有一个很好的理由。决定让属性默认合成原子访问器。

【问题讨论】:

  • 我不确定这个功能是 onXCode 还是 AppCode 或其他 IDE 有!
  • here这两个答案之间,你应该有一个完整的答案。
  • 我认为在早期版本中,iOS 也默认为atomic

标签: objective-c xcode cocoa-touch cocoa


【解决方案1】:

简单得要命:原子通过其隐式互斥机制导致开销(在 OSX 上可以忽略不计)。

iOS(作为 ARM 芯片上的嵌入式系统)无法承受这种开销,因此 IBOutlets 默认为非原子。

一句话:性能

至于为什么它们在 OSX 上默认为原子,属性的线程安全性在像 OSX 这样的大规模多线程、多应用程序环境中是一件好事(尤其是与 iOS 相比,应用程序在 OSX 上比在 iOS 上更有可能相互交互)。

如前所述,OSX 上的开销确实可以忽略不计,因此他们默认它是这样的。

【讨论】:

    【解决方案2】:

    在这种情况下,atomic 说明符告诉编译器应该综合设置器和访问器,以便安全地从多个线程调用。这会增加一些开销,因为它要求方法在写入或读取属性值之前取出锁。

    由于 UIKit 和 Cocoa 的用户界面元素只打算从主线程访问,因此不需要额外的锁。使属性原子化的开销非常小,但在 iOS 更受限制的环境中,每一点速度都是有价值的。因此,为什么 iOS 默认为 IB Outlets 使用 nonatomic 属性。

    针对您的扩展问题进行了编辑:我的感觉是使用原子属性的成本值得在 Mac 上花费。有一种说法是使用原子属性掩盖了一系列错误,因此是一件坏事。我认为,从用户的角度来看,Apple 应该设置默认值,这样即使是编码错误的应用程序也会更少崩溃。它让高级程序员有责任了解何时可以安全地使用非原子属性来换取性能优势。

    当时没有听到团队中某人的消息,我们只能推测他们的思维过程,但我确信这是一个经过深思熟虑的决定。

    【讨论】:

    • 原子属性肯定不是线程安全的。它们只是比非原子属性更安全。它们也很慢,并且相对于方法应该完成的任务(设置或获取变量)发出的指令多得多,这意味着它们会消耗更多的移动设备电量。
    • @CodeFi。我并不是要暗示使属性原子化可以解决多线程问题。澄清一下:原子属性“可以安全地从多个线程调用”,因为您可以保证该属性将始终返回一个有效值。
    • 不是因为Cocoa有时可以多线程绘制属性吗?就像在 NSScrollViews 中一样,它有一个 canDrawConcurrently 属性?
    【解决方案3】:

    在这个问题中,关于原子属性与非原子属性的争论相当冗长:What's the difference between the atomic and nonatomic attributes? 我敢打赌,这与 OSX 应用程序与 iOS 应用程序中普遍存在的界面的相对复杂性有关.一个 OSX 应用程序一直在多个线程上运行是相当普遍的。因此,这些接口有助于在多线程环境中更普遍地运行。在 iOS 中,虽然随着系统的成熟,应用程序肯定会变得越来越复杂,但它们仍然运行在更基本的操作系统上,目前更适合非线程环境。

    还有一些关于非原子属性的讨论通常比原子属性具有更少的开销,并且通常在 iOS 设备中发现更小的 CPU 和更少的内存,除非需要额外的开销,否则将属性默认为非原子是有意义的。

    【讨论】:

      【解决方案4】:

      OSX 可以控制多线程,而且大部分应用程序都使用多线程。因此默认设置为原子。

      而在 iOS 的情况下,您很少使用多个线程,因此非原子为您服务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多