为什么 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_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
是
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_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
是
Swift.