Krótka odpowiedź: TAK, ARC zachowuje i zwalnia kolejki wysyłek.
A teraz długa odpowiedź…
Jeśli cel wdrożenia jest niższy niż iOS 6.0 lub Mac OS X 10.8
Musisz użyć dispatch_retain
i dispatch_release
w swojej kolejce. ARC nimi nie zarządza.
Jeśli celem wdrożenia jest system iOS 6.0 lub Mac OS X 10.8 lub nowszy
ARC będzie zarządzać Twoją kolejką za Ciebie. Nie musisz (i nie możesz) używać dispatch_retain
lub dispatch_release
jeśli ARC jest włączone.
Detale
Począwszy od iOS 6.0 SDK i Mac OS X 10.8 SDK, każdy obiekt wysyłki (w tym a dispatch_queue_t
) jest również obiektem Objective-C. Jest to udokumentowane w <os/object.h>
pliku nagłówkowym:
* 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.
W ten sposób można zapisać kolejkę w sposób NSArray
lub NSDictionary
czy w nieruchomości z jednym z strong
, weak
, unsafe_unretained
, assign
, lub retain
atrybutów. Oznacza to również, że jeśli odwołasz się do swojej kolejki z bloku, blok automatycznie zachowa kolejkę.
Jeśli więc celem wdrożenia jest co najmniej iOS 6.0 lub Mac OS X 10.8 i masz włączone ARC, ARC zachowa i zwolni twoją kolejkę, a kompilator oznaczy każdą próbę użycia dispatch_retain
lub dispatch_release
jako błąd.
Jeśli twoim celem jest wdrożenie co najmniej iOS 6.0 lub Mac OS X 10.8 i masz ARC wyłączona , należy ręcznie zachować i uwolnić swoją kolejkę, albo przez wywołanie dispatch_retain
i dispatch_release
, lub poprzez wysłanie do kolejki retain
i release
wiadomości (jak [queue retain]
i [queue release]
).
Aby zapewnić zgodność ze starymi bazami kodu, możesz uniemożliwić kompilatorowi wyświetlanie kolejki jako obiektu Objective-C, definiując OS_OBJECT_USE_OBJC
to 0
. Na przykład możesz umieścić to w swoim .pch
pliku (przed jakimikolwiek #import
instrukcjami):
#define OS_OBJECT_USE_OBJC 0
lub możesz dodać OS_OBJECT_USE_OBJC=0
jako makro preprocesora w ustawieniach kompilacji. Jeśli ustawisz OS_OBJECT_USE_OBJC
na 0
, ARC nie zatrzyma ani nie zwolni Twojej kolejki za Ciebie i będziesz musiał to zrobić samodzielnie za pomocą dispatch_retain
i dispatch_release
.