微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么有时从 DISpatchQueue 调用时会出现 EXC_BAD_ACCESS?

如何解决为什么有时从 DISpatchQueue 调用时会出现 EXC_BAD_ACCESS?

在以下代码中:

class dispatchQueuer: dispatchQueuerable {
    private let queue: dispatchQueue

    // MARK: - Initialization

    init(queue: dispatchQueue) {
        self.queue = queue
    }
    func asyncBackground(block: @escaping () -> Void) {
        dispatchQueue(label: "",qos: .background).async {
            block() //EXC_BAD_ACCESS
        }
    }
}

为什么会这样?

我使用它的方式如下:

    private let dispatchQueuer: dispatchQueuerable
    dispatchQueuer.asyncBackground { [weak self] in
        self?.setupTags()
        self?.setupsuppliers()
        self?.dispatchQueuer.asyncMain {
            completion?()
        }
    }

解决方法

您有数据竞争问题。部分问题在于每次调用 asyncBackground 都在一个新队列中,因此您很快就会有多个冲突队列和冲突访问。你应该把你的队列变成一个单例队列。这样,至少您将受益于串行队列,而目前您正在丢弃该队列。

请注意,您将 self.queue 声明为实例属性。这在某种程度上是个好主意,但你永远不会使用它!你也把它扔掉。就我个人而言,我会使用 static let 来获得真正的单例串行队列,并且我会使用它。

即便如此,这也不会使您的访问成为线程安全的。但它会比你现在做的好很多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。