Swift dispatch_async 导致 EXC_BAD_ACCESS 错误

标签 swift exc-bad-access dispatch-async

在我的 Swift 项目中,我试图在后台线程中处理一个 FIFO 队列(我在这里将其称为列表以避免混淆)。当我使用 dispatch_async 时,它会在仅执行列表的某些部分后导致 EXC_BAD_ACCESS 错误。 我已尽可能将代码简化为以下 Playground 代码。 在 playground 中,当 main_thread 设置为 true 时,代码会处理列表中的所有 100 个项目。如果为假,则只会处理少数项目。如果代码在项目中,当 main_thread 为 false 时会出现 EXC_BAD_ACCESS。显然,我也尝试过指定一个串行队列,但这似乎没有帮助。 我缺少或不理解什么? 谢谢。

import UIKit

let main_thread = false
let serial_queue = true

class main_class {
    var this_list = list_class()


    func run(){
        for i in 1...100 {
            this_list.add_to_list( String(i) )
        }

        if main_thread {
            this_list.process_list()
        } else {
            if serial_queue {
                let my_serial_queue = dispatch_queue_create("msq", DISPATCH_QUEUE_SERIAL)
                dispatch_async(my_serial_queue){()->Void in
                    self.this_list.process_list()
                }
            } else {
                dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () ->Void in
                    self.this_list.process_list()
                })
            }

        }
    }
}

class list_class {
    var my_list: [String] = []

    func add_to_list( this: String ){
        my_list.append( this )
    }

    func process_list(){
        if my_list.count > 0 {
            print("removing " + my_list[0])
            remove_from_list( my_list[0] )
        }
    }

    func remove_from_list( this: String ){
        let found = my_list.indexOf( this )
        if found != nil {
            my_list.removeAtIndex( found! )
            process_list()
        }
    }
}

var blah = main_class()
blah.run()

最佳答案

您的主线程正在退出,而后台线程仍在运行。主线程结束 -> 进程终止。

为 main 设置一些东西,以便在后台线程仍在运行时阻塞。例如,使用dispatch_group_wait();连同 dispatch_group_enter()dispatch_group_leave()

关于Swift dispatch_async 导致 EXC_BAD_ACCESS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39187421/

相关文章:

swift - 调度队列异步调用

ios - 无法使用类型的参数列表调用 'responseArray'

swift - 在 Alamofire DownloadRequest.dataResponseSerializer 行中看到断点崩溃 + 320

ios - Alamofire 完成处理程序返回响应+数据

iOS 蓝牙 retrievePeripherals 导致 EXC_BAD_ACCESS 崩溃

ios - Swift 3.1 迁移 Dispatch.main.async 对成员 'async(execute:)' 的模糊引用

ios - 如何在 iOS 中编写异步线程类?

ios - 独特的 Realm 容器对象

ios - EXC_BAD_ACCESS code=1 UIScrollView 捏合手势崩溃

ios - 在加载图 block 之前从 MapView 退出时的 EXC_BAD_ACCESS