作为@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
}
}
}
我尝试从 main
和 global(.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
参数或考虑使用不同的同步机制。
我正在尝试使用资源包装器进行线程安全访问。在我的实现中,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
}
}
}
我尝试从 main
和 global(.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
参数或考虑使用不同的同步机制。