iOS 6.0需要在ARC下释放GCD队列吗?
Posted
技术标签:
【中文标题】iOS 6.0需要在ARC下释放GCD队列吗?【英文标题】:Do you need to release GCD queues under ARC in iOS 6.0? 【发布时间】:2012-10-04 15:02:29 【问题描述】:在 Paul Hegarty 课程中的 ios 5 教程之后,我们在一个演示 GCD 使用的应用中看到了这段代码。显然 GCD 需要释放,因为与多线程有关的问题在仍然需要哪些对象方面有些不可预测。
dispatch_async(dowloadQueue, ^
....
// do some stuff
....
);
dispatch_release(dowloadQueue);
我已升级到 iOS 6 和 XCode 4.5,我得到了一个 “ARC 禁止显式发布...”消息
iOS5/XCode 4.2下我没试过这段代码
这仅仅是因为 ARC 变得更聪明了,我不再需要在 GCD 中发布了吗? 还是我误会了?
【问题讨论】:
【参考方案1】:当您以 Mountain Lion 和 iOS 6.0 为目标时,ARC 现在将为您管理调度队列和其他 GCD 类型。如果您针对 OS X 或 iOS 的早期版本,您仍然需要显式保留和释放 GCD 类型(不仅仅是出于线程安全的原因,否则您会泄漏内存),但是仅针对较新的操作系统时会为您处理版本。
这就是您在面向 iOS 6.0 时在 ARC 下看到此类编译器错误的原因。
【讨论】:
创建队列的时候需要__bridge_transfer到Objective-C吗? @openfrog - 不,如果它被视为一个 Objective-C 对象,它已经由 ARC 处理,所以不需要转移它。 @BradLarson 有没有办法关闭它?或者,我该如何编写它才能在 iOS 5 和 iOS 6 下编译? @fishinear if (floor(NSFoundationVersionNumber) @MurraySagal 不起作用,因为这是编译器错误消息,而不是运行时错误。以上是关于iOS 6.0需要在ARC下释放GCD队列吗?的主要内容,如果未能解决你的问题,请参考以下文章