Die kurze Antwort: JA, ARC behält die Versandwarteschlangen bei und gibt sie frei.
Und jetzt zur langen Antwort…
Wenn Ihr Bereitstellungsziel niedriger als iOS 6.0 oder Mac OS X 10.8 ist
Sie müssen dispatch_retain
und verwendendispatch_release
in Ihrer Warteschlange verwenden. ARC verwaltet sie nicht.
Wenn Ihr Bereitstellungsziel iOS 6.0 oder Mac OS X 10.8 oder höher ist
ARC verwaltet Ihre Warteschlange für Sie. Sie müssen oder können dispatch_retain
oder nicht verwendendispatch_release
wenn ARC aktiviert ist.
Einzelheiten
Ab dem iOS 6.0 SDK und dem Mac OS X 10.8 SDK ist jedes Versandobjekt (einschließlich a dispatch_queue_t
) auch ein Objective-C-Objekt. Dies ist in der <os/object.h>
Header-Datei dokumentiert :
* 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.
Diese Mittel können Sie speichern Ihre Warteschlange in ein NSArray
oder NSDictionary
, oder in einem Haus mit einem der strong
, weak
, unsafe_unretained
, assign
, oder retain
Attribute. Dies bedeutet auch, dass der Block die Warteschlange automatisch beibehält, wenn Sie von einem Block aus auf Ihre Warteschlange verweisen.
Also , wenn Ihr Implementierungsziel ist mindestens iOS 6.0 oder Mac OS X 10.8, und Sie haben ARC aktiviert , wird ARC behalten und Ihre Warteschlange freizugeben, und der Compiler - Flag jeden Versuch zu verwenden dispatch_retain
oder dispatch_release
als Fehler.
Wenn Ihre Bereitstellung Ziel mindestens iOS 6.0 oder Mac OS X 10.8, und Sie haben ARC deaktiviert , müssen Sie manuell beibehalten und Ihre Warteschlange freizugeben, entweder durch den Aufruf dispatch_retain
und dispatch_release
, oder durch die Warteschlange zu senden retain
und release
Nachrichten (wie [queue retain]
und [queue release]
).
Aus Gründen der Kompatibilität mit alten Codebasen können Sie verhindern, dass der Compiler Ihre Warteschlange als Objective-C-Objekt sieht, indem Sie OS_OBJECT_USE_OBJC
to definieren 0
. Zum Beispiel können Sie dies in Ihre .pch
Datei einfügen (vor allen #import
Anweisungen):
#define OS_OBJECT_USE_OBJC 0
oder Sie können OS_OBJECT_USE_OBJC=0
in Ihren Build-Einstellungen ein Präprozessor-Makro hinzufügen . Wenn Sie festgelegt OS_OBJECT_USE_OBJC
zu 0
werden ARC nicht behalten oder lassen Sie die Warteschlange für Sie, und Sie werden es zu tun haben , sich mit dispatch_retain
und dispatch_release
.
dispatch_release
undNULL
das Objekt in Ihrem 5.1-dealloc
Code. Andernfalls versucht etwas (vom Compiler generierter Code? Die Laufzeit selbst?), Das Objekt ein zweites Mal freizugeben.Nur eine Folge hier ... Wenn Ihr Mindestbereitstellungsziel iOS 6 ist, verwaltet ARC diese jetzt.
quelle