获得徽章 0
- #iOS知识小集#「 使用strong而不是assign修饰dispatch对象 」by @NotFound--
【原因】
当运行系统是在 iOS6 以下时,是需要通过 dispatch_retain 和 dispatch_release 来管理 dispatch queue 的生命周期的,此时应该使用assign来修饰dispatch_queue_t类型的对象。在iOS6及以后是通过ARC来管理dispatch queue对象的生命周期的,所以应该使用strong来修饰dispatch_queue_t类型的对象。这里以支持iOS5系统的SDWebImage(version:3.7.6)的代码举例:
```
#if OS_OBJECT_USE_OBJC
#define SDDispatchQueueSetterSementics strong
#else
#define SDDispatchQueueSetterSementics assign
#endif
@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t barrierQueue;
```
OS_OBJECT_USE_OBJC是一个编译器选项,当我们工程里面设置的Deployment target大于或等于iOS 6时,OS_OBJECT_USE_OBJC的值会是1,否则会是0。因为我们现在的app普遍都是支持到iOS9或者iOS8,所以dispatch_queue_t类型的对象都是使用ARC来进行管理的,我们使用strong来修饰就好了。
【示例】
在美团近期开源的UI 渲染框架Graver中也发现,错误得使用assign来修饰dispatch_queue_t类型的属性(如图一所示),对Graver框架实际测试时,发现将一个dispatch_queue_t类型的局部变量赋值给对assign修饰的dispatch_queue_t后(如图二所示),会抛出了野指针异常(如图三所示)。然后去github上搜了一下“assign dispatch_queue_t”,发现很多代码也是使用这种错误的写法,所以觉得有必要写个tip,提醒一下大家。展开17