我正在将一些代码从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队列创建非常明显的东西我不知道。
有人可以帮助我吗?
答案 0 :(得分:5)
dispatch_queue_create()
的第二个参数具有类型
dispatch_queue_attr_t
,声明为
typealias dispatch_queue_attr_t = NSObject
您必须将DISPATCH_QUEUE_SERIAL
或nil
传递给串行队列
(或DISPATCH_QUEUE_CONCURRENT
表示并发队列):
var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", DISPATCH_QUEUE_SERIAL)
在C(++)中,可以传递0
而不是NULL
指针。
然而,Swift编译器将整数0
包装到NSNumber
对象中
这样它就可以传递给期望NSObject
的函数
参数。这会导致运行时异常,因为NSNumber
是
不是有效的属性。所以通过0
或nil
是
斯威夫特有很大的不同。