如果我有一个动作敏捷的演员...
@objc public actor SomeActor: NSObject, SomeProtocol { ... }
...我想在 objc 代码中将它用作 ivar,是否需要将其列为原子的以保留其线程安全性,或者将其称为非原子的性能更高?
另外,我是否需要使用 getter 来引用它以保持其线程安全,或者我可以直接调用它吗?
#import <ThisProject/ThisProject-Swift.h>
@interface SomeClass () <SomeId>
@property (strong, atomic, readwrite) SomeActor *someActor;
@end
...
[SomeOtherClass someMethod:someActor];
对
@interface SomeClass () <SomeId>
@property (strong, nonatomic, readwrite) SomeActor *someActor;
@end
...
[SomeOtherClass someMethod:_someActor];
atomic
关键字与属性本身的存储有关,例如在本例中,为 SomeActor *
指针。它所保证的是对指针的更改是原子完成的。
它与所指向事物的语义无关,例如你的演员。
我很少发现我的同步问题与设置特定字段有关。它通常是关于同步整个对象或集合,所以我发现整个
atomic
功能非常可疑。我总是去nonatomic
。
亚历山大回答了你的问题(你应该随意接受他的回答;+1),我提供一些澄清的意见:
atomic
的目的是什么?
属性上的
atomic
限定符仅指示Objective-C如何处理指向actor的指针,与actor的内部行为无关。它只是确保对象的指针地址本身的获取和存储是否是原子的。它对其所指向的对象的内部线程安全性(或缺乏内部线程安全性)没有影响。
应该使用
atomic
还是nonatomic
?
在实践中,
atomic
经常引入(诚然可以忽略不计的)开销,但收益有限。像亚历山大一样,我几乎总是使用nonatomic
。如果 Objective-C 代码存在线程安全问题,则通常需要更高级别的同步,从而使指针的 atomic
本质变得毫无意义。这取决于 Objective-C 代码(与当前问题并不真正相关)。
但是,正如 Alexander 指出的,无论您将属性标记为
atomic
还是 nonatomic
与您指向 actor
或其他 class
的事实无关。
您应该使用属性 getter
self.someActor
,还是访问支持 ivar _someActor
?
您没有明确提出这个问题,但您的示例之一提到了
someActor
(我认为这意味着您打算使用 getter,尽管由于缺少 self.
或前导下划线,所以它不是完全清楚),而另一个,_someActor
(该酒店的支持 ivar)。
正如《Objective-C 编程》中所说,“……对象使用访问器方法或点语法访问其自己的属性是最佳实践。”此规则的两个常见例外是 init
中的 (a); (b) 在手动实现的 getter/setter 中(如果有的话)。
self.someActor
而不是
_someActor
。
nonatomic
。如果您试图确保 Objective-C 代码本身是线程安全的,我们需要查看任何相关代码,但是,通常,仅创建属性
atomic
是不够的。您正在处理 actor
的事实对于选择 atomic
或 nonatomic
没有任何有意义的影响。
对于寻找 actor
与 Objective-C 互操作性描述的人们,请参阅
SE-0297 – 与 Objective-C 的并发互操作性。