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

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

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


当前回答

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

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

其他回答

原子:

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

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

-(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文档的“性能和线程”部分。

原子财产(Atomic properties):-当一个变量被赋值为原子属性时,意味着它只有一个线程访问权限,并且它是线程安全的,从性能角度来看速度较慢,那么它将具有默认行为。

非原子财产:-当一个变量被赋值为非原子属性时,这意味着它具有多线程访问权限,并且它不是线程安全的,从性能角度来看速度很快,它将具有默认行为,并且当两个不同的线程要同时访问该变量时,它将产生意外的结果。

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

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

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

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