objective-c - ARC 是否支持调度队列?

我正在阅读苹果关于“调度队列的内存管理”的文档:

Even if you implement a garbage-collected application, you must still retain and release your dispatch queues and other dispatch objects. Grand Central Dispatch does not support the garbage collection model for reclaiming memory.

我知道 ARC 不是垃圾收集器,但我想确定我不需要 dispatch_retain 和 dispatch_release 我的 dispatch_queue_t

最佳答案

简短的回答:是的,ARC 保留和释放调度队列。







现在是长答案……

如果您的部署目标低于 iOS 6.0 或 Mac OS X 10.8

您需要使用 dispatch_retaindispatch_release在你的队列中。 ARC 不管理它们。

如果您的部署目标是 iOS 6.0 或 Mac OS X 10.8 或更高版本

ARC 将为您管理您的队列。您不需要(也不能)使用 dispatch_retaindispatch_release如果启用了 ARC。

详情

从 iOS 6.0 SDK 和 Mac OS X 10.8 SDK 开始,每个调度对象(包括 dispatch_queue_t )也是一个 Objective-C 对象。这记录在 <os/object.h>头文件:

 * By default, libSystem objects such as GCD and XPC objects are declared as
 * Objective-C types when building with an Objective-C compiler. This allows
 * them to participate in ARC, in RR management by the Blocks runtime and in
 * leaks checking by the static analyzer, and enables them to be added to Cocoa
 * collections.
 *
 * NOTE: this requires explicit cancellation of dispatch sources and xpc
 *       connections whose handler blocks capture the source/connection object,
 *       resp. ensuring that such captures do not form retain cycles (e.g. by
 *       declaring the source as __weak).
 *
 * To opt-out of this default behavior, add -DOS_OBJECT_USE_OBJC=0 to your
 * compiler flags.
 *
 * This mode requires a platform with the modern Objective-C runtime, the
 * Objective-C GC compiler option to be disabled, and at least a Mac OS X 10.8
 * or iOS 6.0 deployment target.

这意味着您可以将队列存储在 NSArray 中或 NSDictionary ,或在具有 strong 之一的属性中, weak , unsafe_unretained , assign , 或 retain属性。这也意味着如果你从一个 block 中引用你的队列,该 block 将自动保留队列。

所以如果您的部署目标至少是 iOS 6.0 或 Mac OS X 10.8,并且您启用了 ARC,ARC 将保留和释放您的队列,并且编译器将标记任何使用 dispatch_retain 的尝试或 dispatch_release作为一个错误。

如果您的部署目标至少为 iOS 6.0 或 Mac OS X 10.8,并且您已禁用 ARC,则必须手动保留和释放队列,或者调用dispatch_retaindispatch_release通过发送队列retainrelease消息(如 [queue retain][queue release] )。

为了与旧代码库兼容,您可以通过定义 OS_OBJECT_USE_OBJC 来防止编译器将队列视为 Objective-C 对象。至0 .例如,您可以将其放入您的 .pch文件(在任何 #import 语句之前):

#define OS_OBJECT_USE_OBJC 0

或者您可以添加 OS_OBJECT_USE_OBJC=0作为build设置中的预处理器宏。如果设置 OS_OBJECT_USE_OBJC0 ,ARC 将不会为您保留或释放您的队列,您必须自己使用 dispatch_retaindispatch_release .

https://stackoverflow.com/questions/8618632/

相关文章:

objective-c - Xcode 版本 (CFBundleShortVersionString

objective-c - presentViewController : crash on iOS

ios - 文档 Main.storyboard 需要 Xcode 8.0 或更高版本

objective-c - 如何在 NSString 中找到最后一次出现的子字符串?

objective-c - 循环遍历 NSMutableDictionary

objective-c - 如何在基于 block 的 API 方法中使用非空和可为空的 Objec

iphone - Objective-C 中的弱属性和强属性 setter 属性

ios - 在 iOS 中创建一个整数数组

objective-c - NSString:isEqual 与 isEqualToString

iphone - 向下移动 UITabBarItem 图像?