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

@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];

VS

@interface SomeClass () <SomeId>
@property (strong, nonatomic, readwrite) SomeActor *someActor;
@end
    
...

    [SomeOtherClass someMethod:_someActor];

推荐答案

虽然亚历山大回答了你的问题(你应该可以接受his answer;+1),但我要提供几个澄清的观察结果:

  1. What is the purpose of 100?

    属性上的atomic限定符只是规定了Objective-C合成访问器如何处理参与者的pointer,与参与者的内部行为无关.正如documentation所说,atomic"意味着合成的访问器确保一个值[本例中的指针]始终由getter方法完全检索或通过setter方法完全设置,即使这些访问器是从不同的线程同时调用的."

    关键字atomic只是确保合成的访问器方法自动获取并存储指针地址本身.它与它所指向的对象的内部线程安全(或缺乏)没有任何关系.

  2. 一百零二

    在实践中,atomic经常带来(诚然可以忽略不计)的管理费用,但yield 有限.像亚历山大一样,我几乎总是用nonatomic.如果Objective-C代码有线程安全问题,人们通常需要更高级别的同步,这使得指针的atomic性质在很大程度上没有意义.这取决于客观C代码(这与直接的问题并不真正相关).

    但是,正如亚历山大指出的那样,无论你将房产标记为atomic还是nonatomic,与你指向的是actor还是class这一事实无关.

  3. 一百零二

    您没有明确地提出这个问题,但在您的一个示例中,您引用了someActor(我认为这意味着您打算使用getter,尽管由于没有self.或前导下划线,这一点并不完全清楚),而在另一个示例中,_someActor(属性的支持IVAR).

    正如百人所言,"…"对象使用访问器方法或点语法访问其自己的属性是最佳实践."这条规则的两个常见例外是(A)在init中;和(B)在手动实现的getters/setter中(如果有).

    因此,简而言之,我通常会使用self.someActor,而不是_someActor.

    请注意,我强调这种访问器与依瓦尔的区别,因为atomic/nonatomic只规定了合成访问器方法的性质.它对通过IVAR进行的直接交互没有影响.因此,atomic依瓦尔有点非顺序性,因为直接与依瓦尔交互也绕过了访问者及其合成行为(包括atomic).

底线是,你可以随意使用nonatomic.如果您试图确保OBJECT-C代码本身是线程安全的,我们将需要查看任何相关代码,但一般来说,仅创建属性atomic是不够的.事实上,你面对的是actor,这对你 Select atomic还是nonatomic没有什么重要的影响.


对于那些正在寻找关于actor与Objective-C互操作性的描述的人,请参见SE-0297 – Concurrency Interoperability with Objective-C.

Swift相关问答推荐

如何在visionOS上删除PhotosPicker背景 colored颜色 ?

在SwiftUI中使用自定义图像填充列表行的正确方法

Variadic泛型与Swift中的值和类型参数包

从`compactMap()`闭包返回`nil`未通过结果类型判断

以编程方式使UIView居中,而不影响UIKit中其他UI类的位置

OSX 中的 Popover 无法确定透明度

从 Obj-C 函数返回 swift 类的不兼容指针类型

Swift 非参与者隔离闭包

Swift 有没有办法在不使用 switch 语句的情况下获取关联值?

如何以快速 Select 器菜单样式调整图像大小

如何在 SwiftUI 的 fileImporter 中为 allowedContentTypes 设置 xcodeproj 类型?

如何删除标签和步进按钮之间的间距是 SwiftUI Stepper?

如何获取 NSRunningApplication 的参数?

如何使用 Date.ParseStrategy 在 Swift 5.6 中将字符串解析为日期?

AES 加密和解密

如何使用 Swift/iOS 为人类书写的笔画制作动画?

即使设置为从不也可以访问 iOS11 照片库

使用 ARAnchor 插入 node 和直接插入 node 有什么区别?

如何在 SwiftUI Segmented Picker 中更改选定的段 colored颜色

如何在swift中的每N个字符处为字符串添加分隔符?