Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ARC是否支持调度队列?_Objective C_Automatic Ref Counting_Grand Central Dispatch - Fatal编程技术网

Objective c 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\

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

即使实现垃圾回收应用程序,也必须保留和释放调度队列和其他调度对象。Grand Central Dispatch不支持回收内存的垃圾收集模型

我知道ARC不是垃圾收集器,但我想确保我不需要分派\u保留和分派\u释放我的分派\u队列\u t

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





现在是一个很长的答案

如果您的部署目标低于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.1
dealloc
代码中的对象。否则,一些东西(由编译器生成的代码?运行时本身?)将再次尝试释放该对象。是否需要分派使用Mac OS 10.7时创建的其他源对象?您必须手动保留/释放OS X 10.7下的所有GCD对象。
#define OS_OBJECT_USE_OBJC 0