Kısa cevap: EVET, ARC gönderim sıralarını korur ve serbest bırakır.
Ve şimdi uzun cevap için…
Dağıtım hedefiniz iOS 6.0 veya Mac OS X 10.8'den düşükse
Sen kullanımına ihtiyaç dispatch_retain
ve dispatch_release
Sıranızdaki. ARC bunları yönetmez.
Dağıtım hedefiniz iOS 6.0 veya Mac OS X 10.8 veya üstü ise
ARC, sıranızı sizin için yönetecek. Kullanmanıza gerek yoktur (ve olamaz) dispatch_retain
veya dispatch_release
ARC etkinleştirilmişse.
Detaylar
İOS 6.0 SDK ve Mac OS X 10.8 SDK'dan başlayarak, her gönderme nesnesi (a dahil dispatch_queue_t
) aynı zamanda bir Objective-C nesnesidir. Bu, <os/object.h>
başlık dosyasında belgelenmiştir :
* 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.
Bu araçlar bir de Sıranıza saklayabilir NSArray
ya NSDictionary
, ya biriyle özelliğinde strong
, weak
, unsafe_unretained
, assign
, veya retain
nitelikler. Ayrıca, sıranıza bir bloktan başvurursanız, bloğun kuyruğu otomatik olarak koruyacağı anlamına gelir.
Dolayısıyla , dağıtım hedefiniz en az iOS 6.0 veya Mac OS X 10.8 ise ve ARC'yi etkinleştirdiyseniz , ARC kuyruğunuzu koruyacak ve serbest bırakacak ve derleyici her türlü kullanma girişimini dispatch_retain
veya dispatch_release
bir hata olarak işaretleyecektir.
Dağıtım hedef en az ise iOS 6.0 veya Mac OS X 10.8 ve ARC devre dışı bıraktık , el tutma ve Sıranıza salmalıdır ya arayarak dispatch_retain
ve dispatch_release
, veya kuyruğu göndererek retain
ve release
(gibi mesajları [queue retain]
ve [queue release]
).
Eski codebases ile uyumluluk için, tanımlayarak bir Objective-C nesne olarak sıranızı görmesini derleyici önleyebilir OS_OBJECT_USE_OBJC
için 0
. Örneğin, bunu .pch
dosyanıza koyabilirsiniz (herhangi bir #import
ifadeden önce ):
#define OS_OBJECT_USE_OBJC 0
veya OS_OBJECT_USE_OBJC=0
yapı ayarlarınıza önişlemci makrosu olarak ekleyebilirsiniz . Eğer ayarlarsanız OS_OBJECT_USE_OBJC
için 0
, ARC olacak değil korumak veya sizin için kuyruk bırakın ve kullanmakta kendiniz yapmak zorunda kalacaktır dispatch_retain
ve dispatch_release
.