"非原子"在此代码中的含义是什么?
@property(nonatomic, retain) UITextField *theUsersName;
原子和非原子有什么区别?
谢谢
看一下Apple Docs.
基本上,如果您说nonatomic
,并且您使用生成访问器@synthesize
,那么如果多个线程尝试一次更改/读取属性,则可能发生错误.您可以获得部分写入的值或过度释放/保留的对象,这很容易导致崩溃.(但这可能比原子访问器快得多.)
如果你使用默认值(这是atomic
;以前没有关键字,但现在有),那么@synthesize
d方法使用对象级锁定来确保序列化对单个属性的多个读/写.正如Apple文档指出的那样,这并不意味着整个对象是线程安全的,而是单个属性的读/写.
当然,如果您实现自己的访问器而不是使用@synthesize
,我认为这些声明除了表达您是否以线程安全方式实现该属性的意图外什么都不做.
阅读了如此多的文章和StackOverflow帖子,并制作了演示应用程序以检查Variable属性属性后,我决定将所有属性信息放在一起
原子//默认
非原子
strong =保留//默认
weak = unsafe_unretained
保留
分配//默认
unsafe_unretained
复制
只读
readwrite //默认
以下是详细的文章链接,您可以在其中找到上述所有属性,这肯定会对您有所帮助.非常感谢所有在这里给出最佳答案的人!
iOS中的变量属性属性或修饰符
原子
原子意味着只有一个线程访问变量(静态类型).
Atomic是线程安全的.
但它的表现很慢.
Atomic是默认行为.
非垃圾收集环境中的原子访问器(即使用retain/release/autorelease时)将使用锁来确保另一个线程不会干扰正确设置/获取值.
它实际上不是关键字.
示例:
@property (retain) NSString *name; @synthesize name;
非原子
Nonatomic意味着多线程访问变量(动态类型).
Nonatomic是线程不安全的.
但它的性能很快.
Nonatomic不是默认行为; 我们需要在属性属性中添加非原子关键字.
当两个不同的进程(线程)同时访问同一个变量时,它可能会导致意外行为.
例:
@property (nonatomic, retain) NSString *name; @synthesize name;
除了已经对线程安全性所说的内容之外,非原子属性比原子访问器更快.这通常不需要担心,但请记住.出于这个原因,核心数据生成的属性部分是非原子的.
在多线程程序中,原子操作不能部分地通过,而非原子操作可以.
因此,如果您的关键操作是非原子的,并且您不希望中断,则应使用互斥锁(或类似的东西).
如果指定"atomic",则生成的访问函数会有一些额外的代码来防止同时更新.
通常原子意味着对属性的写入/读取作为单个操作发生. Atomic_operation