在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_OBJC
macros控制。 当您的部署目标是OS X 10.8或更高版本或iOS 6.0或更高版本时,它默认设置为1
。 如果您正在部署到较旧的操作系统,则将其保留为0
,您应该在下面看到我的原始答案。
原始答案:
派发对象(包括队列)不是Obj-C对象,所以唯一可能的select是assign
。 如果您尝试使用strong
或weak
,编译器会发出错误。 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. */