คำตอบสั้น ๆ : ใช่ ARC จะเก็บรักษาและเผยแพร่คิวการจัดส่ง
และตอนนี้สำหรับคำตอบยาว ...
หากเป้าหมายการปรับใช้ของคุณต่ำกว่า iOS 6.0 หรือ Mac OS X 10.8
คุณต้องใช้dispatch_retain
และdispatch_release
ในคิวของคุณ ARC ไม่ได้จัดการพวกเขา
หากเป้าหมายการปรับใช้ของคุณคือ iOS 6.0 หรือ Mac OS X 10.8 หรือใหม่กว่า
ARC จะจัดการคิวให้คุณ คุณไม่จำเป็นต้อง (และไม่สามารถ) ใช้dispatch_retain
หรือdispatch_release
หากเปิดใช้งาน ARC
รายละเอียด
เริ่มต้นใน iOS 6.0 SDK และ MacOS X 10.8 SDK ทุกออบเจ็กต์การจัดส่ง (รวมถึง a dispatch_queue_t
) จะเป็น Objective-C ด้วย เอกสารนี้อยู่ใน<os/object.h>
ไฟล์ส่วนหัว:
* 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.
ซึ่งหมายความว่าคุณสามารถจัดเก็บคิวของคุณในNSArray
หรือNSDictionary
หรือในสถานที่ให้กับหนึ่งในที่strong
, weak
, unsafe_unretained
, assign
หรือretain
คุณลักษณะ นอกจากนี้ยังหมายความว่าหากคุณอ้างถึงคิวของคุณจากบล็อกบล็อกจะเก็บคิวไว้โดยอัตโนมัติ
ดังนั้นหากเป้าหมายการปรับใช้ของคุณเป็นอย่างน้อย iOS 6.0หรือ Mac OS X 10.8 และคุณเปิดใช้งาน ARC แล้ว ARC จะเก็บรักษาและปล่อยคิวของคุณและคอมไพเลอร์จะตั้งค่าสถานะความพยายามในการใช้dispatch_retain
หรือdispatch_release
เป็นข้อผิดพลาด
หากเป้าหมายการใช้งานของคุณอย่างน้อย iOS 6.0หรือ Mac OS X 10.8 และคุณมี ARC คนพิการคุณต้องรักษาและปล่อยคิวของคุณอย่างใดอย่างหนึ่งโดยการเรียกdispatch_retain
และdispatch_release
, หรือโดยการส่งคิวretain
และrelease
ข้อความ (ชอบ[queue retain]
และ[queue release]
)
สำหรับความเข้ากันได้กับโค้ดเบสเก่าคุณสามารถป้องกันไม่ให้คอมไพลเลอร์เห็นคิวของคุณเป็นอ็อบเจ็กต์ Objective-C โดยกำหนดOS_OBJECT_USE_OBJC
เป็น0
. ตัวอย่างเช่นคุณสามารถใส่สิ่งนี้ใน.pch
ไฟล์ของคุณ(ก่อน#import
คำสั่งใด ๆ):
#define OS_OBJECT_USE_OBJC 0
หรือคุณสามารถเพิ่มOS_OBJECT_USE_OBJC=0
เป็นมาโครตัวประมวลผลล่วงหน้าในการตั้งค่าบิลด์ของคุณ ถ้าคุณตั้งค่าOS_OBJECT_USE_OBJC
ที่จะ0
โค้งจะไม่เก็บหรือปล่อยคิวของคุณสำหรับคุณและคุณจะต้องทำมันด้วยตัวคุณเองโดยใช้และdispatch_retain
dispatch_release