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

时间:2015-03-04 21:17:27

标签: c++ swift queue port grand-central-dispatch

我正在将一些代码从C ++移植到使用Grand Central Dispatch的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

......在initalizer中,我有(除其他外)行

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队列创建非常明显的东西我不知道。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:5)

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是 斯威夫特有很大的不同。