“Dispatch Queues를위한 메모리 관리”에 대한 Apple의 문서를 읽고 있습니다.
가비지 수집 애플리케이션을 구현하더라도 디스패치 큐 및 기타 디스패치 객체를 유지하고 해제해야합니다. Grand Central Dispatch는 메모리 회수를위한 가비지 컬렉션 모델을 지원하지 않습니다.
ARC가 가비지 수집기가 아니라는 것을 알고 있지만 dispatch_retain 및 dispatch_release 내 dispatch_queue_t가 필요하지 않은지 확인하고 싶습니다.
답변
짧은 대답 : 예, ARC는 디스패치 대기열을 유지하고 해제합니다.
이제 긴 대답을 위해 …
배포 대상이 iOS 6.0 또는 Mac OS X 10.8보다 낮은 경우
dispatch_retain
및 dispatch_release
대기열 에서 사용해야 합니다. ARC는이를 관리하지 않습니다.
배포 대상이 iOS 6.0 또는 Mac OS X 10.8 이상인 경우
ARC가 대기열을 관리합니다. ARC를 사용 dispatch_retain
하거나 사용할 필요가 없으며 사용할 수 없습니다 dispatch_release
.
세부
iOS 6.0 SDK 및 Mac OS X 10.8 SDK부터 모든 디스패치 객체 (를 포함 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
오류로 플래그를 지정합니다 .
배포 대상이 적어도 경우 아이폰 OS 6.0 또는 Mac OS X 10.8, 그리고 당신은 ARC를 사용할 수있다 , 당신은 수동으로 유지하고, 당신의 대기열을 해제해야합니다 중 하나를 호출하여 dispatch_retain
하고 dispatch_release
, 또는 큐 보내 retain
와 release
(같은 메시지 [queue retain]
와 [queue release]
).
기존 코드베이스와의 호환성을 위해, 당신은 정의하여 목표 – C 객체로 당신의 큐를 볼 수 컴파일러를 방지 할 수 있습니다 OS_OBJECT_USE_OBJC
에 0
. 예를 들어, .pch
파일에 ( #import
문 앞에 ) 다음을 넣을 수 있습니다 .
#define OS_OBJECT_USE_OBJC 0
또는 OS_OBJECT_USE_OBJC=0
빌드 설정에서 전 처리기 매크로로 추가 할 수 있습니다 . 사용자가 설정 한 경우 OS_OBJECT_USE_OBJC
에 0
, ARC는 것 아니 유지하거나 당신을 위해 대기열을 해제, 당신은 사용하여 직접해야 할 것 dispatch_retain
하고 dispatch_release
.
답변
여기에서 후속 조치를 취하십시오. 최소 배포 대상이 iOS 6 인 경우 이제 ARC에서 관리합니다.