在属性声明中,原子和非原子意味着什么?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
这三者之间的操作差异是什么?
在属性声明中,原子和非原子意味着什么?
@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;
这三者之间的操作差异是什么?
当前回答
默认值是原子的,这意味着无论何时使用该属性都会降低性能,但它是线程安全的。Objective-C的作用是设置一个锁,因此只要执行setter/getter,只有实际线程才能访问变量。
具有ivar_internal的属性的MRC示例:
[_internal lock]; //lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
因此,后两项相同:
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName; // defaults to atomic
另一方面,非原子对代码没有任何影响。所以只有当你自己编写安全机制时,它才是线程安全的。
@property(nonatomic, retain) UITextField *userName;
关键字根本不必写为第一个属性属性。
别忘了,这并不意味着整个属性是线程安全的。只有setter/getter的方法调用是。但是如果您使用setter,然后同时使用2个不同线程的getter,那么它也可能会被破坏!
其他回答
没有这样的关键字“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
如果您在多线程代码中使用属性,那么您将能够看到非原子属性和原子属性之间的区别。非原子比原子快,原子是线程安全的,而不是非原子的。
Vijayendra Tripathi已经给出了一个多线程环境的示例。
原子:通过使用NSLOCK锁定线程来确保线程安全。
非原子:由于没有线程锁定机制,因此无法确保线程安全。