ChatGPT解决这个技术问题 Extra ChatGPT

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

这段代码中的“非原子”是什么意思?

@property(nonatomic, retain) UITextField *theUsersName;

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

谢谢

抱歉,忘记指定这是在 Objective-c (cocoa) 中
另请阅读此链接 - stackoverflow.com/questions/588866/…
对于阅读本文的任何人来说,对于 2014 年来说,重要的是要意识到很多此类信息已经过时了。总之,没有理由使用非原子,而且无论出于何种原因,使用它本质上都是错误的。这是古老的历史。 Nonatomic 的意思是“线程不安全模式”,并且(总而言之)现在完全无关紧要。这里有一些评论stackoverflow.com/q/23977765/294884
我不同意“不相关”的说法。如果值很少更改,并且 Apple 文档中的示例是姓氏。它更改一次然后使用原子提示是浪费所涉及的资源,因为不需要检查。

J
Jesse Rusak

看看 Apple Docs

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

如果您使用默认值(即 atomic;过去没有关键字,但有 is now),则 @synthesized 方法使用对象级锁来确保对一个单个属性被序列化。正如 Apple 文档所指出的,这并不意味着整个对象都是线程安全的,但单个属性 read/writes 是。

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


我喜欢这个答案——比其他地方的答案更简单、更简单、更完整!
真的很棒,而且不那么令人困惑(+1),但是您能告诉我为什么非原子访问器可能比原子访问器快得多吗?
@Wish 非原子访问器可以更快,因为为了防止其他线程同时读取/写入,您需要持有互斥锁或执行一些其他低级技巧,这些技巧会花费 CPU 时间。如果您使用锁,您也可能最终阻塞其他线程,这也需要时间。
@Rob您可能想就此提出一个新问题。
@Pratik对不起,那不正确。您显示的引用与我所做的完全相同:创建属性 atomic 可避免在访问单个属性时崩溃,但 确保对象作为一个整体(即访问单独的属性,例如名字和姓氏)将做正确的事情。
T
Todd Lehman

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

atomic //默认非原子 strong=retain //默认 weak= unsafe_unretained retain assign //默认 unsafe_unretained copy readonly readwrite //default

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

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

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

例子 :

@property (retain) NSString *name;

@synthesize name;

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

例子:

@property (nonatomic, retain) NSString *name;

@synthesize name;

M
Marc Charbonneau

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


j
joshdick

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

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


P
Paul Tomblin

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


N
NANNAV

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


E
Easwaramoorthy K

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

Threading Explained with the nonatomic's purpose

nonatomic - 不是线程安全的

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


你确定不是相反?原子属性是安全的,但非原子属性是不安全的。上次我检查是这样的:P
U
USM

“原子”意味着对属性的访问是线程安全的。而“非原子”则相反。当您在 Objective-C 中声明属性时,属性默认是原子的,因此合成访问器提供对属性的稳健访问在多线程环境中——也就是说,无论其他线程同时执行什么,从 getter 或通过 setter 返回的值总是完全检索或设置。但是如果您将属性声明为如下所示的非原子

@property (nonatomic, retain)  NSString *myString;

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


佚名

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


恕我直言:为了获得任何支持,您需要更加具体并花一些时间来写下您的答案。