【问题标题】:Crash happens when executing concurrent queue.sync执行并发 queue.sync 时发生崩溃
【发布时间】:2022-07-06 18:23:47
【问题描述】:

我从 Crashlytics 收到报告说,当应用程序在 getter 中执行到 safeQueue.sync 时,经常会发生崩溃。

此队列用于保护线程不安全数组的访问。

崩溃类型是EXC_BAD_ACCESS KERN_PROTECTION_FAILURE,但是我不明白为什么这行代码会导致内存访问问题。

private let safeQueue = DispatchQueue(label: "contact.manager.safe.queue", attributes: .concurrent)
    private var _allContacts = [Contact]()
    private(set) var allContacts: [Contact] {
        get {
            safeQueue.sync {
                _allContacts
            }
        }
        set {
            safeQueue.async(flags: .barrier) { [weak self] in
                self?._allContacts = newValue
            }
        }
    }

【问题讨论】:

  • 你为什么使用同步?如果您删除队列并正常进行会发生什么

标签: ios swift debugging concurrency grand-central-dispatch


【解决方案1】:

这是对计算值的误用,这主要发生在您尝试访问变量时,而它仍在同步您在async 和getter sync 中使用的setter 中的setter 上的值,这为错误 我建议删除 DispatchQueue 部分,因为我在这里看不到它的任何用途,为什么当您已经拥有 newValue 时设置一个值应该是 async 任务?我建议将该部分移到更高的级别,async 获取newValue 的任务然后只需设置它并正常获取它

【讨论】:

    最近更新 更多