为什么dispatch_queue_create在Swift中给出EXC_BAD_ACCESS错误

Why does dispatch_queue_create give an EXC_BAD_ACCESS error in Swift?

本文关键字:EXC BAD ACCESS 错误 Swift queue dispatch create 为什么      更新时间:2023-10-16

我正在将一些使用Grand Central Dispatch的C++代码移植到Swift,我发现Dispatch_queue_create似乎根本不起作用,这是一个奇怪的错误。

例如,在我的C++基类头中,我会声明

dispatch_queue_t m_WorkQ;

在初始化器中,放入

m_ResultQ = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0);

一切都很美好。


我在Swift中尝试过,在我的课堂上,在课堂级别声明了这一点:

var resultQueue: dispatch_queue_t

在初始化程序中,我有(除其他外)行

resultQueue = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0)

它编译和启动都很好,但在上面的行上给我一个EXC_BAD_ACCESS(代码=1,地址=0x37)的即时运行时错误

为了确定这是否是我所做的其他事情,我创建了一个仅由以下代码组成的命令行工具应用程序:

import Foundation
var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", 0)
println(thisQueue.description)

果不其然,我在"thisQueue"分配行中得到了上述错误。因此,我确信Swift和GCD队列创建有一些非常明显的地方是我所缺少的。

有人能帮我吗?

dispatch_queue_create()的第二个参数具有类型dispatch_queue_attr_t,声明为

typealias dispatch_queue_attr_t = NSObject

您必须为串行队列传递DISPATCH_QUEUE_SERIALnil(对于并发队列,则为DISPATCH_QUEUE_CONCURRENT):

var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", DISPATCH_QUEUE_SERIAL)

在C(++)中,可以传递0而不是NULL指针。

然而,Swift编译器将整数0封装到NSNumber对象中以便将其传递给期望CCD_ 10的函数参数这会导致运行时异常,因为NSNumber不是有效的属性。因此通过0nilSwift的差异显著。