lms*_*lms 24 xcode cocoa cocoa-touch objective-c
如果您将一个新的插座从Interface Builder拖到一个接口(标题)文件,Xcode 4.6将自动为您创建一个属性...
在iOS(Cocoa Touch)上,它看起来像这样:
@property (weak, nonatomic) SomeClass *someProperty; //nonatomic accessors
Run Code Online (Sandbox Code Playgroud)
而在OS X(Cocoa)上,它看起来像这样:
@property (weak) SomeClass *someProperty; //atomic accessors (implicitly)
Run Code Online (Sandbox Code Playgroud)
为什么?
编辑:我不是在问什么原子做什么或不做什么,我很清楚同步指令和底层互斥(或锁等)保证了setter和getter的原子性.我知道在iOS上,访问器是非原子的,因为UIKit不是线程安全的,因此没有任何东西可以通过使它们成为原子来获得,这只是浪费处理器时间和电池寿命.我在这里谈论默认情况,知道他们正在做什么的程序员将知道他们何时需要使他们的访问器成为原子.
所以我问为什么它们在OS X上默认是原子的.我的印象是Appkit也不是线程安全的.并且拥有原子访问器并不能保证线程的安全性,我甚至会说它反过来说它可以给新手程序员带来线程安全的错觉,并通过延迟崩溃使并发应用程序中的bug跟踪变得更难到了以后的某个时间,这使得它们更难以追踪.仅仅因为台式计算机相对强大并不意味着资源应该被浪费(注意我不是在谈论过早的优化),并且因为苹果工程师是合理的程序员,所以他们必须有充分的理由决定默认情况下使属性合成原子访问器.
在此上下文中,atomic说明符告诉编译器应该合成setter和accessor,以便从多个线程调用是安全的.通过要求方法在写入或读取属性值之前取出锁定,这会增加很小的开销.
由于UIKit和Cocoa的用户界面元素仅用于从主线程访问,因此不需要额外的锁定.使属性成为原子的开销非常小,但在iOS受限制的环境中,每一小的速度都是有价值的.因此iOS默认使用nonatomicIB Outlets的属性.
编辑以回应您的扩展问题:我的感觉是使用原子属性的成本值得Mac上的开销.这是一个争论,即使用原子属性掩盖了一系列错误,因此是一件坏事.我认为,从用户的角度来看,Apple应该设置默认值,这样即使编码错误的应用程序也会崩溃.它使高级程序员有责任知道何时使用非原子属性以换取性能优势是安全的.
当时我们没有听到团队中的某些人的意见,我们只能推测他们的思维过程,但我确信这是一个被认为是一个决定性的决定.
| 归档时间: |
|
| 查看次数: |
2056 次 |
| 最近记录: |