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队列吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ARC 时还需要释放内存吗? [复制]

iOS UIImageView 内存没有在 ARC 上被释放

目标 C 和 ARC

iOS:ARC,不释放内存

ios:ARC中的过度释放对象[关闭]

iOS:释放正在使用的对象 (ARC)