在Objective-C(和Swift)中,弱属性线程安全吗?

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

当由于最后一个强引用消失而被取消时,如果在另一个线程上发生问题,您会遇到问题吗?如果是这样,使用原子能正确吗?由于我相信Swift没有原子,因此那里的线程安全弱属性需要什么?

objective-c swift xcode thread-safety weak-references
2个回答
0
投票

在Swift中,几乎所有东西本质上都不是线程安全的-不是引用,不是弱引用,不是数组,不是字符串,也不是任何其他可变值。

如果要对两个线程的任何内容进行写/读或写/写访问,则必须使用锁来确保安全。

https://medium.com/@mohit.bhalla/thread-safety-in-ios-swift-7b75df1d2ba6

此链接应有帮助!


0
投票

是。 weak是ARC的一部分,并由Clang承诺是原子的。尤其请参见“自动参考计数”文档中的“ lang”部分的4.2 Semantics部分。

对此特别感兴趣的是这些部分(添加了重点):

阅读

对于__weak对象,将保留当前指针,然后在当前全表达式的结尾将其释放。 这必须在任务分配和最终指示对象的发布方面以原子方式执行。

分配

对于__weak对象,除非新指针是当前正在释放的对象,否则将更新左值以指向新指针,在这种情况下,左值将更新为空指针。 这必须对对象的其他分配,从对象的读取以及新pointe的最终发行版都以原子方式执行。

请注意,许多其他操作不是原子操作,特别是强任务。但是保留计数本身也是线程安全的。您可以自由地在任何线程上保留和释放对象,并且最后的保留计数将是正确的。

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