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
.
dispatch_release
iNULL
obiekt wdealloc
kodzie 5.1 . W przeciwnym razie coś (kod wygenerowany przez kompilator? Samo środowisko wykonawcze?) Spróbuje zwolnić obiekt po raz drugi.Po prostu kontynuacja tutaj ... Jeśli minimalnym celem wdrożenia jest iOS 6, ARC teraz nimi zarządza.
źródło