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

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

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


当前回答

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

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

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

其他回答

原子属性确保保留完全初始化的值,而不管有多少线程在其上执行getter和setter。

非原子属性指定合成访问器只需直接设置或返回一个值,而不保证从不同线程同时访问同一个值会发生什么。

-原子意味着只有一个线程访问变量(静态类型)。-原子是线程安全的。-但它的性能很慢

如何申报:

由于原子是默认的,

@property (retain) NSString *name;

实现文件中的AND

self.name = @"sourov";

假设与三个财产相关的任务是

 @property (retain) NSString *name;
 @property (retain) NSString *A;
 @property (retain) NSString *B;
 self.name = @"sourov";

所有财产并行工作(如异步)。

如果从线程A调用“name”,

And

同时如果你打电话

[self setName:@"Datta"]

从线程B,

现在,如果*name属性是非原子的,那么

它将返回A的值“Datta”它将返回B的值“Datta”

这就是为什么非原子被称为线程不安全的原因,但由于并行执行,它的性能很快

现在如果*name属性是原子的

这将确保A的价值“Sourov”然后它将返回B的值“Datta”

这就是为什么原子被称为线程安全和这就是为什么它被称为读写安全

这种情况操作将连续执行。性能缓慢

-非原子意味着多线程访问变量(动态类型)。

-非原子是线程不安全的。

-但它的性能很快

-非原子不是默认行为,我们需要在属性属性中添加非原子关键字。

对于In Swift确认Swift财产在ObjC意义上是非原子的。一个原因是,您需要考虑每个属性的原子性是否足以满足您的需求。

参考:https://forums.developer.apple.com/thread/25642

有关更多信息,请访问网站http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

原子:

原子保证以原子的方式访问财产。例如,它总是返回一个完全初始化的对象,一个线程上的属性的任何获取/设置都必须在另一个线程访问它之前完成。

如果你想象一下下面的函数同时出现在两个线程上,你就会明白为什么结果不好看。

-(void) setName:(NSString*)string
{
  if (name)
  {
    [name release]; 
    // what happens if the second thread jumps in now !?
    // name may be deleted, but our 'name' variable is still set!
    name = nil;
  }

  ...
}

赞成的意见:每次返回完全初始化的对象是多线程情况下的最佳选择。

欺骗:性能受到影响,执行速度稍慢

非原子:

与Atomic不同,它不能确保每次都返回完全初始化的对象。

赞成的意见:执行速度极快。

欺骗:在多线程的情况下,可能会产生垃圾值。

首先最简单的回答是:第二个例子之间没有区别。默认情况下,属性访问器是原子的。

非垃圾收集环境中的原子访问器(即,当使用retain/release/autorelease时)将使用锁来确保另一个线程不会干扰值的正确设置/获取。

有关更多信息以及创建多线程应用程序时的其他注意事项,请参阅苹果Objective-C 2.0文档的“性能和线程”部分。

原子意味着一次只能有一个线程访问变量(静态类型)。原子是线程安全的,但它很慢。

非原子意味着多个线程可以同时访问变量(动态类型)。非原子线程不安全,但速度很快。