在属性声明中,原子和非原子意味着什么?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

这三者之间的操作差异是什么?


当前回答

如果您使用的是atomic,这意味着线程将是安全且只读的。如果您使用的是非原子的,这意味着多个线程访问变量,并且线程不安全,但它执行速度很快,执行了读写操作;这是一种动态类型。

其他回答

如果您在多线程代码中使用属性,那么您将能够看到非原子属性和原子属性之间的区别。非原子比原子快,原子是线程安全的,而不是非原子的。

Vijayendra Tripathi已经给出了一个多线程环境的示例。

原子:通过使用NSLOCK锁定线程来确保线程安全。

非原子:由于没有线程锁定机制,因此无法确保线程安全。

在阅读了这么多文章、StackOverflow文章和制作用于检查变量属性的演示应用程序后,我决定将所有属性信息放在一起:

atomic//默认非原子的strong=保留//默认弱=未染色保持分配//默认值未染色的复制只读的readwrite//默认

在iOS中的可变属性属性或修饰符一文中,您可以找到上述所有属性,这肯定会对您有所帮助。

原子的原子意味着只有一个线程访问变量(静态类型)。atomic是线程安全的。但它的性能很慢原子是默认行为非垃圾收集环境中的原子访问器(即,当使用retain/release/autorelease时)将使用锁来确保另一个线程不会干扰值的正确设置/获取。它实际上不是一个关键字。例子:@属性(retain)NSString*name;@综合名称;非原子的非原子意味着多线程访问变量(动态类型)。非原子是线程不安全的。但它的性能很快非原子不是默认行为。我们需要在属性属性中添加非原子关键字。当两个不同的进程(线程)同时访问同一变量时,可能会导致意外行为。例子:@属性(非原子,保留)NSString*name;@综合名称;

我在这里找到了原子和非原子财产的一个很好的解释。以下是一些相关文本:

“原子”意味着它不能分解。在OS/编程术语中,原子函数调用是一个不能中断的调用——必须执行整个函数,并且在完成之前,不能通过操作系统通常的上下文切换将其从CPU中移出。万一你不知道:由于CPU一次只能做一件事,操作系统会在很小的时间段内对所有正在运行的进程轮流访问CPU,从而产生多任务的错觉。CPU调度器可以(并且确实)在进程执行的任何时间点中断进程,即使是在函数调用中间。因此,对于像更新共享计数器变量这样的操作,如果两个进程可以同时尝试更新变量,则必须“原子”地执行这些操作,即,每个更新操作必须完整完成,然后才能将任何其他进程交换到CPU上。所以我猜测,在这种情况下,原子意味着属性读取器方法不能被中断,实际上意味着该方法读取的变量不能中途更改其值,因为其他线程/调用/函数被交换到CPU上。

因为原子变量不能被中断,所以它们在任何时候包含的值(线程锁)都保证不会被破坏,尽管确保这个线程锁会使对它们的访问变慢。另一方面,非原子变量不能保证这一点,但确实提供了快速访问的奢侈。总之,当您知道变量不会被多个线程同时访问时,可以使用非原子的,这样可以加快速度。

原子的

是默认行为将确保当前进程在另一个进程访问变量之前由CPU完成速度不快,因为它可以确保整个过程完全完成

非原子的

不是默认行为更快(对于合成代码,即使用@property和@synthetic创建的变量)非线程安全当两个不同的进程同时访问同一变量时,可能会导致意外行为