在ARC之后,我应该使用哪个属性来发送调度队列?

我维护一个调度队列作为一个属性与我的视图控制器。 我在我的视图控制器的init方法中创build了一个这个队列,并为一些后台任务重复使用了几次。 在ARC之前,我是这么做的:

@property (nonatomic, assign) dispatch_queue_t filterMainQueue; 

在init中:

 if (filterMainQueue == nil) { filterMainQueue = dispatch_queue_create("com.myQueue.CJFilterMainQueue", NULL); } 

但是在ARC之后,我不确定这是否应该“分配”,还是应该是“强”还是“弱”。 ARC转换器的脚本没有改变任何东西,但是我不确定这个队列是否可以在使用的时候释放一个细微的错误。

使用ARC时,3种属性之间的区别是什么?对于调度队列,最有效的是什么?

更新回答:

在当前的OS X和iOS中,Dispatch对象现在被ARC视为Obj-C对象。 它们将以与Obj-C对象相同的方式进行内存pipe理,您应该使用strong的属性。

这由<os/object.h>定义的OS_OBJECT_USE_OBJCmacros控制。 当您的部署目标是OS X 10.8或更高版本或iOS 6.0或更高版本时,它默认设置为1 。 如果您正在部署到较旧的操作系统,则将其保留为0 ,您应该在下面看到我的原始答案。


原始答案:

派发对象(包括队列)不是Obj-C对象,所以唯一可能的select是assign 。 如果您尝试使用strongweak ,编译器会发出错误。 ARC对GCD没有影响。

以下是如何为iOS 6.0及更高版本和低于iOS 6.0定义dispatch_queue_t属性

 #if OS_OBJECT_HAVE_OBJC_SUPPORT == 1 @property (nonatomic, strong) dispatch_queue_t serialDispatchQueue; #else @property (nonatomic, assign) dispatch_queue_t serialDispatchQueue; #endif 

对于iOS 6.0及更高版本,基本上OS_OBJECT_HAVE_OBJC_SUPPORT被定义为1。 (MAC 10.8及以上)。 在iOS 6下面,它被定义为0。

OS_OBJECT_HAVE_OBJC_SUPPORT定义像GCD这样的OS对象具有客观的C支持。 所以ARC,内存pipe理,引用计数等都适用于GCD对象。

这是我使用的:

 @property (readwrite, strong, nonatomic) __attribute__((NSObject)) dispatch_queue_t queue; 

基于iOS7,我testing了dispatch_queue对象是否是一个Objective-C对象,我发现它们已经是objective-c对象。 为了解释这个, 属性 ((NSObject))现在是不需要的。

TL; DR: dispatch_queue_t现在是一个Objective C对象,可以使用ARC进行pipe理。

我还没有testing过这种情况,但是使用iOS 7 SDK和Xcode 5, dispatch_queue_t是一个对象types。 我正在为一个队列声明一个属性

 @property (nonatomic, strong) dispatch_queue_t syncQueue; 

编译器很高兴,一切按预期工作。 我明确知道,这在iOS 4或5(预ARC是retain而不是strong )不起作用。 我挖掘了dispatch_queue_t的定义,并发现这一点:

 /*! * @typedef dispatch_queue_t * * @abstract * Dispatch queues invoke blocks submitted to them serially in FIFO order. A * queue will only invoke one block at a time, but independent queues may each * invoke their blocks concurrently with respect to each other. * * @discussion * Dispatch queues are lightweight objects to which blocks may be submitted. * The system manages a pool of threads which process dispatch queues and * invoke blocks submitted to them. * * Conceptually a dispatch queue may have its own thread of execution, and * interaction between queues is highly asynchronous. * * Dispatch queues are reference counted via calls to dispatch_retain() and * dispatch_release(). Pending blocks submitted to a queue also hold a * reference to the queue until they have finished. Once all references to a * queue have been released, the queue will be deallocated by the system. */ DISPATCH_DECL(dispatch_queue); 

听起来,它不应该工作,所以我检查了DISPATCH_DECL的定义,并发现这一点,这解释了一切:

 /* * 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. */