提问人:Parth 提问时间:4/20/2021 最后编辑:Parth 更新时间:4/20/2021 访问量:246
Swift:具有存储属性的枚举,即使使用串行队列进行突变,也不是线程安全的
Swift: Enums with stored properties not thread safe even when mutated using a serial queue
问:
此问题与 Apple 开发者论坛上报告的另一个问题有关,该问题标题为 4 年前的 deinit 中如何避免数据争用。我看到生产中出现与编译器添加的关联数据和代码相关的崩溃,以取消初始化具有包含引用类型的关联数据的枚举。outlined consume
在试图找出其他人是否遇到同样的问题时,我偶然发现了上面的帖子。我将该帖子中的示例简化为下面的更简单示例,并可靠地因访问不当而崩溃。(我在 Playground 中运行了它并崩溃了,但没有堆栈跟踪)
import Foundation
class Racer {
let queue = DispatchQueue(label: "Racer-\(UUID())")
var value: String? = "" // Desugars to Optional<String>, an enum
func race() {
queue.async {[weak self] in
self?.value = UUID().uuidString
}
}
}
let racer = Racer()
while true {
racer.race()
}
error:执行中断,原因:EXC_BAD_ACCESS(code=1,address=0x357d20cc94c0)。
这是 Swift 中尚未修补的错误吗?
答: 暂无答案
评论
guard let self = self else { return }
可能会阻止此崩溃。但是由于类似的原因,我看到我们的生产代码崩溃了。这是同一问题的非常简单的复制。我试图引起更多关注 如何在deinit中避免数据竞赛 这似乎是关键问题