“Nonatomic”属性是什么意思?

时间:2009-05-04 19:52:41

标签: ios objective-c iphone cocoa properties

此代码中“非原子”是什么意思?

@property(nonatomic, retain) UITextField *theUsersName;

原子和非原子有什么区别?

由于

9 个答案:

答案 0 :(得分:264)

查看Apple Docs

基本上,如果您说nonatomic,并且使用@synthesize生成访问者,那么如果多个线程尝试一次更改/读取属性,则可能发生错误。您可以获得部分写入的值或过度释放/保留的对象,这很容易导致崩溃。 (但这可能比原子访问器快得多。)

如果您使用默认值(atomic;以前没有关键字,但有is now),则@synthesize d方法使用对象级锁定确保序列化对单个属性的多个读/写操作。正如Apple文档指出的那样,这并不意味着整个对象是线程安全的,但是单个属性的读/写是。

当然,如果您实现自己的访问器而不是@synthesize,我认为这些声明除了表达您是否以线程安全方式实现该属性的意图外什么都不做。

答案 1 :(得分:46)

在阅读了如此多的文章和StackOverflow帖子,并制作了演示应用来检查变量属性属性后,我决定将所有属性信息放在一起

  1. atomic // default
  2. 非原子
  3. strong = retain // default
  4. weak = unsafe_unretained
  5. 保留
  6. assign // default
  7. unsafe_unretained
  8. 复制
  9. 只读
  10. readwrite // default
  11. 以下是详细的文章链接,您可以在其中找到上面提到的所有属性,这肯定会对您有所帮助。 非常感谢所有在这里给出最佳答案的人!!

      

    Variable property attributes or Modifiers in iOS

    1. 原子
      • Atomic意味着只有一个线程访问变量(静态类型)。
      • Atomic是线程安全的。
      • 但表现不佳。
      • Atomic是默认行为。
      • 非垃圾收集环境中的原子访问器(即使用retain / release / autorelease时)将使用锁来确保另一个线程不会干扰正确设置/获取值。
      • 它实际上不是关键字。
    2. 示例:

      @property (retain) NSString *name;
      
      @synthesize name;
      
      1. 非原子
        • Nonatomic表示多线程访问变量(动态类型)。
        • Nonatomic是线程不安全的。
        • 但表现很快。
        • Nonatomic不是默认行为;我们需要在属性属性中添加非原子关键字。
        • 当两个不同的进程(线程)同时访问同一个变量时,它可能会导致意外行为。
      2. 示例:

        @property (nonatomic, retain) NSString *name;
        
        @synthesize name;
        

答案 2 :(得分:12)

除了已经对线程安全性所说的内容之外,非原子属性比原子访问器更快。这通常不需要担心,但请记住。出于这个原因,核心数据生成的属性部分是非原子的。

答案 3 :(得分:9)

在多线程程序中,原子操作不能部分通过,而非原子操作可以。

因此,如果您的关键操作是非原子的,并且不想中断,则应使用互斥锁(或类似的东西)。

答案 4 :(得分:8)

如果指定“atomic”,则生成的访问函数会有一些额外的代码来防止同时更新。

答案 5 :(得分:6)

通常原子意味着对属性的写入/读取作为单个操作发生。 Atomic_operation

答案 6 :(得分:2)

您可以通过阅读以下文章来了解这些内容。

Threading Explained with the nonatomic's purpose

非原子 - 非线程安全

atomic - 线程安全 - 这是默认属性。

答案 7 :(得分:0)

“atomic”表示对该属性的访问是线程安全的。而“nonatomic”则与之相反。 在Objective-C中声明属性时,默认情况下属性是原子的,以便合成访问器在多线程环境中提供对属性的强大访问 - 也就是说,从getter返回的值或通过setter设置的值总是被完全检索或设置,无论如何其他线程同时执行的内容但是,如果您将属性声明为非原子属,如下所示

@property (nonatomic, retain)  NSString *myString;

然后它意味着对象属性的合成访问器只是直接返回值。 非原子属性的影响取决于环境。默认情况下,合成访问器是原子的。所以非原子比原子快得多。

答案 8 :(得分:-2)

一个用于多线程。一个不是