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

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

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


当前回答

没有这样的关键字“atomic”

@property(atomic, retain) UITextField *userName;

我们可以使用上面的

@property(retain) UITextField *userName;

请参阅堆栈溢出问题,如果我使用@property(atomic,retain)NSString*myString,我会遇到问题。

其他回答

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

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

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

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

如何申报:

由于原子是默认的,

@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

原子的

是默认行为将确保当前进程在另一个进程访问变量之前由CPU完成速度不快,因为它可以确保整个过程完全完成

非原子的

不是默认行为更快(对于合成代码,即使用@property和@synthetic创建的变量)非线程安全当两个不同的进程同时访问同一变量时,可能会导致意外行为

没有这样的关键字“atomic”

@property(atomic, retain) UITextField *userName;

我们可以使用上面的

@property(retain) UITextField *userName;

请参阅堆栈溢出问题,如果我使用@property(atomic,retain)NSString*myString,我会遇到问题。

原子:通过使用NSLOCK锁定线程来确保线程安全。

非原子:由于没有线程锁定机制,因此无法确保线程安全。