【问题标题】:Do you need to release GCD queues under ARC in iOS 6.0?iOS 6.0需要在ARC下释放GCD队列吗?
【发布时间】: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 中发布了吗? 还是我误会了?

【问题讨论】:

    标签: ios xcode automatic-ref-counting grand-central-dispatch


    【解决方案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 不起作用,因为这是编译器错误消息,而不是运行时错误。
    猜你喜欢
    • 2014-04-25
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2013-08-25
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多