“非原子”属性是什么意思?

“非原子”在这个代码中是什么意思?

@property(nonatomic, retain) UITextField *theUsersName;

原子和非原子的区别是什么?

谢谢

72969 次浏览

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

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

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

因此,如果您的关键操作是非原子的,不希望中断,那么应该使用互斥锁(或类似的东西)。

看看 苹果文档

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

如果使用默认值(即 atomic; 以前没有这个值的关键字,但有 就是现在) ,那么 @synthesized 方法使用对象级锁来确保对单个属性的多次读/写被序列化。正如 Apple 文档指出的那样,这并不意味着整个对象是线程安全的,但是单独的属性读/写是。

当然,如果您实现自己的访问器而不是使用 @synthesize,我认为这些声明除了表达您是否以线程安全的方式实现该属性的意图之外没有任何作用。

除了已经提到的线程安全性之外,非原子属性比原子访问器更快。这不是你通常需要担心的事情,但请记住这一点。部分由于这个原因,核心数据生成的属性是非原子的。

一个是多线程,一个不是

“原子”意味着对该属性的访问是线程安全的。而 “非原子”则相反。 在 Objective-C 中声明属性时,属性默认是原子的,这样合成访问器就可以在多线程环境中提供对属性的健壮访问ーー也就是说,通过 setter 从 getter 或 set 返回的值总是被完全检索或设置,而不管其他线程在并发执行什么。但是如果像下面这样将属性声明为非原子的

@property (nonatomic, retain)  NSString *myString;

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

你可以通过阅读下面的文章来掌握这些东西。

用非原子的目的解释线程

非原子-非线程安全

Atom-Thread Safe-这是默认属性属性。

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

  1. 原子//默认值
  2. 非原子的
  3. Strong = 保留//默认值
  4. 不安全[无保留]
  5. 保留
  6. 赋值//默认值
  7. 不安全 _ 没有保留
  8. 收到
  9. 只读
  10. Readwrite//default

所以下面是详细的文章链接,在那里你可以找到上面提到的所有属性,这肯定会帮助你。 非常感谢所有在这里给出最好答案的人! !

IOS 中的可变属性属性或修饰符

  1. 原子弹
    • 原子意味着只有一个线程访问变量(静态类型)。
    • 原子是线程安全的。
    • 但它的性能很慢。
    • 原子是默认行为。
    • 非垃圾收集环境中的原子访问器(例如,在使用保留/释放/自动释放时)将使用一个锁来确保另一个线程不会干扰正确的值设置/获取。
    • 它实际上不是一个关键词。

例如:

@property (retain) NSString *name;


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

例如:

@property (nonatomic, retain) NSString *name;


@synthesize name;