gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:16:05 25 4
gpt4 key购买 nike

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

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

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

关于c++ - 为什么 dispatch_queue_create 在 Swift 中给出 EXC_BAD_ACCESS 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28865148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com