作为@noescape 传递给 Objective-C 的闭包参数已转义

Closure argument passed as @noescape to Objective-C has escaped

我正在尝试使用资源包装器进行线程安全访问。在我的实现中,awaitedValue 字段通过串行队列执行同步 read 资源。出于某种原因,每当我尝试阅读此 属性 时,我的应用程序都会因错误而崩溃,这对于同步代码来说没有任何意义。

class ThreadsafeResource<T> {
    private let accessorsQueue: DispatchQueue
    private var resource: T
    
    //MARK: Initializers
    init(_ resource: T) {
        self.resource = resource
        self.accessorsQueue = DispatchQueue(label: "X")
    }

    //MARK: Synchronous access
    var awaitedValue: T {
        accessorsQueue.sync(flags: .inheritQoS) { // Point where my app crashes.
            self.resource
        }
    }
}

我尝试从 mainglobal(.utility) 队列中读取它——结果相同。并且对资源的异步调用工作正常。

当您提供 flags 时,问题就出现了。如果删除它,问题就会消失。

查看堆栈跟踪,它在 _syncHelper, which declares the closure as escaping when it’s not really, AFAICT. This rendition of _syncHelper is called when you supply flags and it’s not empty 中失败了。

我将提交错误报告,因为 _syncHelper 将该参数设置为 @escaping 似乎不正确。

目前,我建议您只删除 flags 参数或考虑使用不同的同步机制。