我正在阅读苹果关于“调度队列的内存管理”的文档:
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
最佳答案
现在是长答案……
您需要使用 dispatch_retain
和 dispatch_release
在你的队列中。 ARC 不管理它们。
ARC 将为您管理您的队列。您不需要(也不能)使用 dispatch_retain
或 dispatch_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_retain
和 dispatch_release
,或通过发送队列retain
和 release
消息(如 [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_OBJC
至0
,ARC 将不会为您保留或释放您的队列,您必须自己使用 dispatch_retain
和 dispatch_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 属性