使用GCD时的内存管理问题

对于 dispatch_queue_t 对象来说,我们应该这么写
#if OS_OBJECT_USE_OBJC
@property  ( strong nonatomic dispatch_queue_t  barrierQueue;
#else
@property  ( assign nonatomic ) dispatch_queue_t barrierQueue;
#endif
在dealloc方法中应该加上
#if !OS_OBJECT_USE_OBJC    // 这个宏是在 sdk6.0 之后才有的 , 如果是之前的 , OS_OBJECT_USE_OBJC 0
    dispatch_release(_barrierQueue);
#endif
当然了,也可以使用
#if __IPHONE_OS_VERSION_MIN_REQUIRED <  60000   // 6.0sdk 之前
    dispatch_release(_barrierQueue);
#endif
这里的宏   __IPHONE_OS_VERSION_MIN_REQUIRED    就是我们在工程的设置项里设置的最低部署sdk版本


原因就是  对于最低sdk版本>=ios6.0来说,GCD对象已经纳入了ARC的管理范围,我们就不需要再手工调用 dispatch_release了,否则的话,在sdk<6.0的时候,即使我们开启了ARC,这个宏OS_OBJECT_USE_OBJC 也是没有的,也就是说这个时候,GCD对象还必须得自己管理

如果你部署的最低目标低于 iOS 6.0 or Mac OS X 10.8
你应该自己管理GCD对象,使用(dispatch_retain,dispatch_release),ARC并不会去管理它们

如果你部署的最低目标是 iOS 6.0 or Mac OS X 10.8 或者更高的
ARC已经能够管理GCD对象了,这时候,GCD对象就如同普通的OC对象一样,不应该使用dispatch_retain ordispatch_release 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值