我声明了一个属性来引用 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 对象,我必须自己负责内存管理!ARC 从什么时候开始为我处理 C 对象?
在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 中执行此操作将引发编译器错误。
使用的是iOS 6 SDK,则会出现此错误消息。
在iOS 6.0 SDK
和Mac OS X 10.8 SDK
中,每个调度对象也是目标C的一部分。所以你不用担心内存,ARC会管理dispatch_queue
的内存。
详情请参阅链接。
你不应该坚持使用assign
。您可以使用:
@property (nonatomic) dispatch_queue_t backgroundQueue;
甚至
@property dispatch_queue_t backgroundQueue;
没有任何警告。
魔术dispatch_retain
和dispatch_release
函数是根据许多条件定义的。
我的测试底线: - 如果您部署 SDK 5,请使用它们,一切都很好 - 如果你部署SDK>= 6,甚至不要考虑它们,只是将所有内容视为对象
你可以在这里看到更好的解释:https://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues?rq=1