为什么ARC抱怨iOS 6中的dispatch_queue_create和dispatch_release?

时间:2012-12-04 12:16:58

标签: ios memory-management automatic-ref-counting grand-central-dispatch

我声明了一个属性来引用GCD队列:

@property (assign) dispatch_queue_t backgroundQueue;

在类的init方法中,我创建了一个串行队列:

backgroundQueue = dispatch_queue_create("com.company.app", DISPATCH_QUEUE_SERIAL);

ARC抱怨:“将保留对象分配给unsafe_unretained变量;对象将在分配后释放”

我必须使用__bridge_transfer吗?

在-dealloc中我正在释放队列:

dispatch_release(backgroundQueue);

同样,ARC抱怨说:“ARC禁止明确发送'发布'消息”

我发现这令人困惑,因为这是一个C函数调用,思想队列是C对象,我必须自己处理内存管理!从什么时候开始为我处理C-objects?

4 个答案:

答案 0 :(得分:39)

在iOS 6中,您可以cmd +点击dispatch_queue_t并查看:

/*
 * By default, dispatch 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.
 * See <os/object.h> for details.
 */

所以只需在属性中使用strong(除非队列在别处被引用,你真的想要一个弱引用)。

在iOS 6之前,你必须自己使用dispatch_retain和dispatch_release进行内存管理。在iOS 6中执行此操作将引发编译器错误。

答案 1 :(得分:9)

如果您使用 iOS 6 SDK,则会出现此错误消息。

iOS 6.0 SDKMac OS X 10.8 SDK中,每个派遣对象也是目标C的一部分。所以你不想担心内存,ARC会管理{{1 }}

请参阅link了解详情。

答案 2 :(得分:3)

您不应该坚持使用assign。您可以使用:

@property (nonatomic) dispatch_queue_t backgroundQueue;

甚至

@property dispatch_queue_t backgroundQueue;

没有任何警告。

答案 3 :(得分:1)

魔术dispatch_retaindispatch_release函数是根据许多条件定义的。

我的测试中的底线:   - 如果你为sdk 5部署,使用它们一切都很好   - 如果你为sdk&gt; = 6部署,甚至不考虑它们,只需将所有内容视为对象

您可以在此处看到更好的解释:https://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues?rq=1