我使用视图控制器将调度队列维护为属性。我在视图控制器的init方法中创建了一次此队列,并重复使用了几次后台任务。在ARC之前,我这样做了:
@property (nonatomic, assign) dispatch_queue_t filterMainQueue;
在init中:
if (filterMainQueue == nil) {
filterMainQueue = dispatch_queue_create("com.myQueue.CJFilterMainQueue", NULL);
}
但是在ARC之后,我不确定这应该仍然是“分配”,还是应该是“强”还是“弱”。 ARC转换器脚本没有改变任何东西,但我不确定是否有一个微妙的错误来自这个队列在被使用时可能被解除分配的事实?
使用ARC时,3种类型的属性和调度队列最适合的是什么?
答案 0 :(得分:59)
更新回答:
在当前的OS X和iOS中,Dispatch对象现在被ARC视为Obj-C对象。它们将以与Obj-C对象相同的方式进行内存管理,您应该使用strong
作为您的属性。
这由OS_OBJECT_USE_OBJC
中定义的<os/object.h>
宏控制。默认情况下,当您的部署目标是OS X 10.8或更高版本,或iOS 6.0或更高版本时,它会设置为1
。如果您要部署到较旧的操作系统,请将其保留在0
,您应该会在下面看到我的原始答案。
原始答案:
Dispatch对象(包括队列)不是Obj-C对象,因此唯一可能的选择是assign
。如果您尝试使用strong
或weak
,编译器将抛出错误。 ARC对GCD没有影响。
答案 1 :(得分:9)
以下是如何为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这样的操作系统对象具有客观的C支持。因此,ARC,内存管理,引用计数等适用于GCD对象。
答案 2 :(得分:5)
以下是我使用的内容:
@property (readwrite, strong, nonatomic) __attribute__((NSObject)) dispatch_queue_t queue;
答案 3 :(得分:4)
基于iOS7,我测试了dispatch_queue对象是否是一个Objective-C对象,我发现它们已经是objective-c对象了。换句话说,现在不需要属性((NSObject))。
答案 4 :(得分:1)
TL; DR:dispatch_queue_t
现在是一个Objective C对象,可以使用ARC进行管理。
我还没有测试过多久这是真的,但是使用iOS 7 SDK和Xcode 5,dispatch_queue_t
是一种对象类型。我将队列的属性声明为
@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.
*/