20

我声明了一个引用 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 禁止发送明确的‘release’消息”

我觉得这很令人困惑,因为这是一个 C 函数调用,并且认为队列是 C 对象,我必须自己负责内存管理!从什么时候开始 ARC 为我处理 C 对象?

4

4 回答 4

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 中这样做会引发编译器错误。

于 2012-12-04T14:47:54.837 回答
10

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

iOS 6.0 SDK和 中Mac OS X 10.8 SDK,每个 dispatch 对象也是 Objective C 的一部分。所以你不用担心内存,ARC 会管理dispatch_queue.

详情请参阅链接

于 2012-12-04T12:55:36.393 回答
3

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

@property (nonatomic) dispatch_queue_t backgroundQueue;

甚至

@property dispatch_queue_t backgroundQueue;

没有任何警告。

于 2013-08-12T21:43:17.730 回答
1

魔术dispatch_retaindispatch_release功能是根据许多条件定义的。

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

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

于 2014-02-10T11:48:58.593 回答