如果您将一个新的插座从Interface Builder拖到一个接口(标题)文件,Xcode 4.6将自动为您创建一个属性...
在iOS(Cocoa Touch)上,它将如下所示:
@property (weak, nonatomic) SomeClass *someProperty; //nonatomic accessors
在OS X(Cocoa)上,它看起来像这样:
@property (weak) SomeClass *someProperty; //atomic accessors (implicitly)
为什么?
编辑:我不是在问什么原子做什么或不做什么,我很清楚同步指令和底层互斥(或锁或其他)保证原子性的原子性二传手和吸气剂。我知道在iOS上,访问器是非原子的,因为UIKit不是线程安全的,因此没有任何东西可以通过使它们成为原子来获得,这只是浪费处理器时间和电池寿命。我在这里谈论默认情况,知道他们正在做什么的程序员将知道他们何时需要使他们的访问器成为原子。
所以我问为什么它们在OS X上默认是原子的。我的印象是Appkit也不是线程安全的。并且拥有原子访问器并不能保证线程安全,我甚至会说它反过来说它可以给新手程序员带来线程安全的错觉,并通过延迟崩溃使并发应用程序中的bug跟踪变得更难到了以后的某个时间,这使得它们更难以追踪。仅仅因为台式计算机相对强大并不意味着资源应该被浪费(注意我不是在谈论过早的优化),并且因为苹果工程师是合理的程序员,所以他们必须有充分的理由决定默认情况下使属性合成原子访问器。
答案 0 :(得分:7)
在此上下文中,atomic
说明符告诉编译器应该合成setter和accessor,以便从多个线程调用是安全的。通过要求方法在写入或读取属性值之前取出锁定,这会增加很小的开销。
由于UIKit和Cocoa的用户界面元素只能从主线程访问,因此不需要额外的锁定。使属性成为原子的开销非常小,但在iOS受限制的环境中,每一小的速度都是有价值的。因此iOS默认使用IB Outlets的nonatomic
属性。
针对您的扩展问题进行了编辑:我的感觉是使用原子属性的成本值得Mac上的开销。这是一个争论,即使用原子属性掩盖了一系列错误,因此是一件坏事。我认为,从用户的角度来看,Apple应该设置默认值,这样即使编码错误的应用程序也会崩溃。它使高级程序员有责任知道何时使用非原子属性以换取性能优势是安全的。
当时我们没有听到团队成员的意见,我们只能推测他们的思考过程,但我确信这是一个被认为是决定性的决定。
答案 1 :(得分:4)
简单如下:原子导致开销(在OSX上可忽略不计)及其隐式互斥机制。
iOS(作为ARM芯片上的嵌入式系统)无法承受这种开销,因此IBOutlets默认为非原子。
总之:效果。
至于为什么他们在OSX上默认为atomic,在OSX上的大规模多线程,多应用程序环境中,特性上的线程安全性是一件好事(特别是与iOS相比,应用程序更可能在OSX上相互交互而不是在iOS上。
如前所述,OSX上的开销实际上可以忽略不计,因此他们默认这样做。
答案 2 :(得分:3)
在这个问题上有一个关于原子与非原子属性的相当冗长的争论:What's the difference between the atomic and nonatomic attributes?我敢打赌,它更多地与OSX应用程序中常见的接口的相对复杂性有关。 iOS应用。让OSX应用程序一直在多个线程上运行是相当普遍的。因此,接口有助于在多线程环境中更常见地操作。在iOS中,虽然随着系统的成熟,应用程序肯定会变得越来越复杂,但它们仍然在更基本的操作系统上运行,目前这种操作系统非常适合非线程环境。
还有一些关于非原子属性的讨论通常具有较少的开销而不是原子属性,并且通常在iOS设备中具有较小的CPU和较少的内存,除非需要额外的开销,否则将默认属性用于非原子是有意义的。
答案 3 :(得分:1)
OSX可以控制多个线程,并且大多数应用程序使用多个线程。因此,默认设置为atomic。
虽然在iOS的情况下,很少你会使用多个线程,因此非原子为你服务。