微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在将一些代码从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

……在初始化者中,我有(除其他外)这条线

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队列创建非常明显的东西,我很遗憾.

有人可以帮帮我吗?

解决方法:

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或零是
在Swift中有很大的不同.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐