Câu trả lời ngắn gọn: CÓ, ARC giữ lại và giải phóng hàng đợi gửi.
Và bây giờ là câu trả lời dài…
Nếu mục tiêu triển khai của bạn thấp hơn iOS 6.0 hoặc Mac OS X 10.8
Bạn cần sử dụng dispatch_retain
và dispatch_release
trong hàng đợi của bạn. ARC không quản lý chúng.
Nếu mục tiêu triển khai của bạn là iOS 6.0 hoặc Mac OS X 10.8 trở lên
ARC sẽ quản lý hàng đợi của bạn cho bạn. Bạn không cần (và không thể) sử dụng dispatch_retain
hoặc dispatch_release
nếu ARC được bật.
Chi tiết
Bắt đầu từ SDK iOS 6.0 và Mac OS X 10.8 SDK, mọi đối tượng điều phối (bao gồm cả a dispatch_queue_t
) cũng là một đối tượng Objective-C. Điều này được ghi lại trong <os/object.h>
tệp tiêu đề:
* 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.
Điều này có nghĩa bạn có thể lưu trữ hàng đợi của bạn trong một NSArray
hoặc NSDictionary
, hoặc trong một tài sản với một trong những strong
, weak
, unsafe_unretained
, assign
, hoặc retain
các thuộc tính. Điều đó cũng có nghĩa là nếu bạn tham chiếu đến hàng đợi của mình từ một khối, khối đó sẽ tự động giữ lại hàng đợi.
Vì vậy, nếu mục tiêu triển khai của bạn ít nhất là iOS 6.0 hoặc Mac OS X 10.8 và bạn đã bật ARC, ARC sẽ giữ lại và giải phóng hàng đợi của bạn, đồng thời trình biên dịch sẽ gắn cờ bất kỳ nỗ lực nào để sử dụng dispatch_retain
hoặc dispatch_release
là lỗi.
Nếu mục tiêu triển khai của bạn ít nhất là iOS 6.0 hoặc Mac OS X 10.8, và bạn có ARC tàn tật , bạn phải tự duy trì và giải phóng hàng đợi của bạn, hoặc bằng cách gọi dispatch_retain
và dispatch_release
, hoặc bằng cách gửi hàng đợi retain
và release
tin nhắn (như [queue retain]
và [queue release]
).
Để tương thích với các cơ sở mã cũ, bạn có thể ngăn trình biên dịch xem hàng đợi của bạn như một đối tượng Objective-C bằng cách xác định OS_OBJECT_USE_OBJC
thành 0
. Ví dụ: bạn có thể đặt điều này vào .pch
tệp của mình (trước bất kỳ #import
câu lệnh nào ):
#define OS_OBJECT_USE_OBJC 0
hoặc bạn có thể thêm OS_OBJECT_USE_OBJC=0
làm macro bộ xử lý trước trong cài đặt bản dựng của mình. Nếu bạn đặt OS_OBJECT_USE_OBJC
thành 0
, ARC sẽ không giữ lại hoặc giải phóng hàng đợi của bạn cho bạn và bạn sẽ phải tự thực hiện bằng cách sử dụng dispatch_retain
và dispatch_release
.