Objective c ARC是否支持调度队列?
我正在阅读苹果关于“调度队列内存管理”的文档: 即使实现垃圾回收应用程序,也必须保留和释放调度队列和其他调度对象。Grand Central Dispatch不支持回收内存的垃圾收集模型 我知道ARC不是垃圾收集器,但我想确保我不需要分派\u保留和分派\u释放我的分派\u队列\u t简短的回答:是的,ARC保留和释放分派队列。Objective c ARC是否支持调度队列?,objective-c,automatic-ref-counting,grand-central-dispatch,Objective C,Automatic Ref Counting,Grand Central Dispatch,我正在阅读苹果关于“调度队列内存管理”的文档: 即使实现垃圾回收应用程序,也必须保留和释放调度队列和其他调度对象。Grand Central Dispatch不支持回收内存的垃圾收集模型 我知道ARC不是垃圾收集器,但我想确保我不需要分派\u保留和分派\u释放我的分派\u队列\u t简短的回答:是的,ARC保留和释放分派队列。 现在是一个很长的答案 如果您的部署目标低于iOS 6.0或Mac OS X 10.8 您需要在队列上使用dispatch\u retain和dispatch\
现在是一个很长的答案 如果您的部署目标低于iOS 6.0或Mac OS X 10.8 您需要在队列上使用
dispatch\u retain
和dispatch\u release
。ARC不管理它们
如果您的部署目标是iOS 6.0或Mac OS X 10.8或更高版本
ARC将为您管理队列。如果启用ARC,则不需要(也不能)使用dispatch\u retain
或dispatch\u release
细节
从iOS 6.0 SDK和Mac OS X 10.8 SDK开始,每个分派对象(包括分派队列
)也是Objective-C对象。这记录在
头文件中:
*默认情况下,libSystem对象(如GCD和XPC对象)声明为
*使用Objective-C编译器生成时,Objective-C类型。这允许
*他们将参与ARC、块运行时的RR管理和
*通过静态分析仪进行泄漏检查,并将其添加到Cocoa中
*收藏。
*
*注:这需要明确取消调度源和xpc
*其处理程序块捕获源/连接对象的连接,
*分别。确保此类捕获不会形成保留周期(例如
*将源声明为_弱)。
*
*要退出此默认行为,请将-DOS\u OBJECT\u USE\u OBJC=0添加到
*编译器标志。
*
*这种模式需要一个具有现代Objective-C运行时的平台
*Objective-C GC编译器选项被禁用,并且至少有一个Mac OS X 10.8
*或iOS 6.0部署目标。
这意味着您可以将队列存储在NSArray
或NSDictionary
中,或存储在具有strong
、弱
、不安全(未恢复
、分配
或保留
属性之一的属性中。这还意味着,如果从块中引用队列,该块将自动保留队列
因此如果您的部署目标至少是iOS 6.0或Mac OS X 10.8,并且您启用了ARC,ARC将保留并释放您的队列,编译器将把任何尝试使用dispatch\u retain
或dispatch\u release
的行为标记为错误
如果您的部署目标至少是iOS 6.0或Mac OS X 10.8,并且您已禁用ARC,则必须手动保留和释放队列,方法是调用dispatch\u retain
和dispatch\u release
,或发送队列retain
和release
消息(如[队列保留]
和[队列释放]
)
为了与旧的代码库兼容,您可以通过将OS\u object\u USE\u OBJC
定义为0
来防止编译器将您的队列视为Objective-C对象。例如,您可以将其放入.pch
文件中(在任何\import
语句之前):
或者,您可以在构建设置中将
OS\u OBJECT\u USE\u OBJC=0
添加为预处理器宏。如果您将OS\u OBJECT\u USE\u OBJC
设置为0
,ARC将不为您保留或释放队列,您必须自己使用dispatch\u retain
和dispatch\u release
<请在此跟进……如果您的最低部署目标是iOS 6,ARC现在将管理它们。这也适用于Mountain Lion。如果您的部署目标是iOS 6或Mountain Lion,则您无法(默认情况下)管理它们使用dispatch_release,因为这是一个宏,向ARC下不允许的对象发送释放消息。但是,请注意,新的更改将dispatch对象指定为Objective-C对象。因此,即使ARC被禁用,如果被块捕获,这些对象也将自动保留,就像所有其他Objective-C对象一样。有一个有趣的边缘案例。如果你的库部署到iOS 5.1,你的应用部署到6.0,并且你正在使用ARC,你需要dispatch\u release
和NULL
在你的5.1dealloc
代码中的对象。否则,一些东西(由编译器生成的代码?运行时本身?)将再次尝试释放该对象。是否需要分派使用Mac OS 10.7时创建的其他源对象?您必须手动保留/释放OS X 10.7下的所有GCD对象。
#define OS_OBJECT_USE_OBJC 0