objc 代码中 Swift Actor 的 ivar:原子还是非原子?

问题描述 投票:0回答:2

如果我有一个动作敏捷的演员...

@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];
swift objective-c actor bridge
2个回答
2
投票

atomic
关键字与属性本身的存储有关,例如在本例中,为
SomeActor *
指针。它所保证的是对指针的更改是原子完成的。

它与所指向事物的语义无关,例如你的演员。

我很少发现我的同步问题与设置特定字段有关。它通常是关于同步整个对象或集合,所以我发现整个

atomic
功能非常可疑。我总是去
nonatomic


0
投票

亚历山大回答了你的问题(你应该随意接受他的回答;+1),我提供一些澄清的意见:

  1. atomic
    的目的是什么?

    属性上的

    atomic
    限定符仅指示Objective-C如何处理指向actor的指针,与actor的内部行为无关。它只是确保对象的指针地址本身的获取和存储是否是原子的。它对其所指向的对象的内部线程安全性(或缺乏内部线程安全性)没有影响。

  2. 应该使用

    atomic
    还是
    nonatomic

    在实践中,

    atomic
    经常引入(诚然可以忽略不计的)开销,但收益有限。像亚历山大一样,我几乎总是使用
    nonatomic
    。如果 Objective-C 代码存在线程安全问题,则通常需要更高级别的同步,从而使指针的
    atomic
    本质变得毫无意义。这取决于 Objective-C 代码(与当前问题并不真正相关)。

    但是,正如 Alexander 指出的,无论您将属性标记为

    atomic
    还是
    nonatomic
    与您指向
    actor
    或其他
    class
    的事实无关。

  3. 您应该使用属性 getter

    self.someActor
    ,还是访问支持 ivar
    _someActor

    您没有明确提出这个问题,但您的示例之一提到了

    someActor
    (我认为这意味着您打算使用 getter,尽管由于缺少
    self.
    或前导下划线,所以它不是完全清楚),而另一个,
    _someActor
    (该酒店的支持 ivar)。

    正如《Objective-C 编程》中所说,“……对象使用访问器方法或点语法访问其自己的属性是最佳实践。”此规则的两个常见例外是 init 中的 (a); (b) 在手动实现的 getter/setter 中(如果有的话)。

    所以,简而言之,我通常会使用 

    self.someActor

    而不是

    _someActor
    
    

  4. 底线,请随意使用
nonatomic

。如果您试图确保 Objective-C 代码本身是线程安全的,我们需要查看任何相关代码,但是,通常,仅创建属性

atomic
是不够的。您正在处理
actor
的事实对于选择
atomic
nonatomic
没有任何有意义的影响。

对于寻找
actor

与 Objective-C 互操作性描述的人们,请参阅

SE-0297 – 与 Objective-C 的并发互操作性

© www.soinside.com 2019 - 2024. All rights reserved.