财产申报中的含义atomic和nonatomic含义是什么?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
Run Code Online (Sandbox Code Playgroud)
这三者之间的运作区别是什么?
如果您将一个新的插座从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跟踪变得更难到了以后的某个时间,这使得它们更难以追踪.仅仅因为台式计算机相对强大并不意味着资源应该被浪费(注意我不是在谈论过早的优化),并且因为苹果工程师是合理的程序员,所以他们必须有充分的理由决定默认情况下使属性合成原子访问器.