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

Why does dispatch_queue_create give an EXC_BAD_ACCESS error in Swift?

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

例如,在我的 C++ 基础 class header 中,我会声明

dispatch_queue_t m_WorkQ;

并在初始值设定项中输入

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

...一切都是光荣的。


我在 Swift 中尝试过,在我的 class 中,在 class 级别声明:

var resultQueue: dispatch_queue_t

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

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

... 它编译并启动正常,但在上面的行

上给我一个立即运行时错误 EXC_BAD_ACCESS (code=1, address = 0x37)

为了确定它是否是我所做的任何其他事情,我创建了一个仅包含以下代码的命令行工具应用程序:

import Foundation

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

println(thisQueue.description)

...果然,我在 "thisQueue" 分配行上得到了上述错误。所以我很确定关于 Swift 和 GCD queue 的创作我确实遗漏了一些非常明显的东西。

谁能帮我解决这个问题?

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 对象中 这样它就可以传递给需要 NSObject 的函数 范围。这会导致运行时异常,因为 NSNumber 是 不是有效的属性。所以传递 0nil 是 Swift.

明显不同