Does ARC support dispatch queues?
I’m reading apple’s documentation about “Memory Management for Dispatch Queues”:
Even if you implement a garbage-collected application, you must still retain and release your dispatch queues and other dispatch objects. Grand Central Dispatch does not support the garbage collection model for reclaiming memory.
I know that ARC is not a garbage collector but I’d like to be sure that I don’t need to dispatch_retain and dispatch_release my dispatch_queue_t
2 Solutions Collect From Internet About “Does ARC support dispatch queues?”
The short answer: YES, ARC retains and releases dispatch queues.
And now for the long answer…
If your deployment target is lower than iOS 6.0 or Mac OS X 10.8
You need to use
dispatch_release on your queue. ARC does not manage them.
If your deployment target is iOS 6.0 or Mac OS X 10.8 or later
ARC will manage your queue for you. You do not need to (and cannot) use
dispatch_release if ARC is enabled.
Starting in the iOS 6.0 SDK and the Mac OS X 10.8 SDK, every dispatch object (including a
dispatch_queue_t) is also an Objective-C object. This is documented in the
<os/object.h> header file:
* By default, libSystem objects such as GCD and XPC 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. * * NOTE: this requires explicit cancellation of dispatch sources and xpc * connections whose handler blocks capture the source/connection object, * resp. ensuring that such captures do not form retain cycles (e.g. by * declaring the source as __weak). * * To opt-out of this default behavior, add -DOS_OBJECT_USE_OBJC=0 to your * compiler flags. * * This mode requires a platform with the modern Objective-C runtime, the * Objective-C GC compiler option to be disabled, and at least a Mac OS X 10.8 * or iOS 6.0 deployment target.
This means you can store your queue in an
NSDictionary, or in a property with one of the
retain attributes. It also means that if you refer to your queue from a block, the block will retain the queue automatically.
So if your deployment target is at least iOS 6.0 or Mac OS X 10.8, and you have ARC enabled, ARC will retain and release your queue, and the compiler will flag any attempt to use
dispatch_release as an error.
If your deployment target is at least iOS 6.0 or Mac OS X 10.8, and you have ARC disabled, you must manually retain and release your queue, either by calling
dispatch_release, or by sending the queue
release messages (like
[queue retain] and
For compatibility with old codebases, you can prevent the compiler from seeing your queue as an Objective-C object by defining
0. For example, you can put this in your
.pch file (before any
#define OS_OBJECT_USE_OBJC 0
or you can add
OS_OBJECT_USE_OBJC=0 as a preprocessor macro in your build settings. If you set
0, ARC will not retain or release your queue for you, and you will have to do it yourself using
Just a follow up here… If your minimum deployment target is iOS 6, ARC now manages them.
- Can't disable bounce with UIScrollView and pagingEnabled=YES
- How can I get the opposite value of a Bool in Swift?
- How can I make a function execute every second in swift?
- How to restore non-renewing Apple subscriptions
- how can i set landscape orientation when playing a video from webview
- Submitting App from building in Xcode 6.4
- Check if String contains any String from array
- How to move UILabel using left or right side?
- AutoLayout and UILabel resize animation not working properly on device rotation
- Facebook Login Swift iOS 10 – Nothing Works
- Swift 2 syntax error with direction .Forward
- XCode / iOS: Iterating through all instances of a given class?
- What do the “M” and “A” icons in the Project Navigator of Xcode 4 mean when I create a new project?
- Using Core animation to animate StrokeColor
- iOS iPhone 5 Choose Correct Storyboard