dispatch_release dispatch_retain 在 最低版兼容本为 6.0 or later 并且使用 ARC 的情况下 error

来源:互联网 发布:小学生的英语软件 编辑:程序博客网 时间:2024/05/17 01:31
对于dispatch_queue_t 对象来说,我们应该这么写

  
#if !OS_OBJECT_USE_OBJC   //这个宏是在sdk6.0之后才有的,如果是之前的,OS_OBJECT_USE_OBJC0
    dispatch_release(_barrierQueue);
#endif
当然了,也可以使用
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 60000 //  最低兼容版本为 6.0
    dispatch_release(_barrierQueue);
#endif
这里的宏  __IPHONE_OS_VERSION_MIN_REQUIRED  就是我们在工程的设置项里设置的  Deployment Target 

原因就是  对于最低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  


苹果文档原文

Dispatch Queues and Automatic Reference Counting


The behavior of dispatch queues in an automatic reference counting environment varies depending on the deployment target that you choose for a given build target.

  • iOS 6 and later—Dispatch objects (including queues) are Objective-C objects, and are retained and released automatically.
  • OS X 10.8 and later—Dispatch objects (including queues) are Objective-C objects, and are retained and released automatically.
  • Earlier versions—Dispatch objects are custom objects. You must handle the reference counting manually by callingdispatch_retain and dispatch_release.

If you need to use manual reference counting in an ARC-enabled app with a later deployment target (for maintaining compatibility with existing code), you can disable Objective-C-based dispatch objects by adding-DOS_OBJECT_USE_OBJC=0 to your compiler flags.



1 0
原创粉丝点击