ARC之后我应该使用什么属性用于Dispatch Queue?

Z S*_*Z S 39 objective-c grand-central-dispatch automatic-ref-counting

我使用我的视图控制器将调度队列维护为属性.我在视图控制器的init方法中创建了一次此队列,并重复使用了几次后台任务.在ARC之前,我这样做:

@property (nonatomic, assign) dispatch_queue_t filterMainQueue;
Run Code Online (Sandbox Code Playgroud)

在init中:

if (filterMainQueue == nil) {
     filterMainQueue = dispatch_queue_create("com.myQueue.CJFilterMainQueue", NULL);
}
Run Code Online (Sandbox Code Playgroud)

但是在ARC之后,我不确定这应该仍然是"分配",还是应该是"强"还是"弱".ARC转换器脚本没有改变任何东西,但我不确定一个微妙的错误是否来自这个队列在被使用时可能被解除分配的事实?

使用ARC时,3种类型的属性和调度队列最适合的是什么?

Lil*_*ard 60

更新的答案:

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

这由OS_OBJECT_USE_OBJC宏定义,在中定义<os/object.h>.1默认情况下,当您的部署目标是OS X 10.8或更高版本,或iOS 6.0或更高版本时,它将设置为.如果您正在部署到较旧的操作系统,那么剩下的就是0,您应该在下面看到我原来的答案.


原始答案:

调度对象(包括队列)不是Obj-C对象,因此唯一可能的选择是assign.如果您尝试使用strong或,编译器将抛出错误weak.ARC对GCD没有影响.

  • 在Mountain Lion中不再适用 - 请参阅/usr/include/os/object.h.GCD和XPC"对象"(你可能明确发布的任何东西)现在表现得像ObjC对象一样,它们可以参与ARC. (13认同)
  • 最好不要检查支持是否存在,而是检查它是否正在使用中.检查`OS_OBJECT_USE_OBJC` (2认同)

Kri*_*ian 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
Run Code Online (Sandbox Code Playgroud)

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

OS_OBJECT_HAVE_OBJC_SUPPORT定义了像GCD这样的操作系统对象具有客观的C支持.因此,ARC,内存管理,引用计数等适用于GCD对象.


Arv*_*vin 5

这是我使用的:

@property (readwrite, strong, nonatomic) __attribute__((NSObject)) dispatch_queue_t queue;
Run Code Online (Sandbox Code Playgroud)

  • 它基本上将非ObjC对象转换为ObjC属性,因此您可以像self.queue一样轻松使用它 (2认同)