संक्षिप्त जवाब: हाँ, एआरसी बरकरार है और प्रेषण कतार जारी करता है।
और अब लंबे उत्तर के लिए ...
यदि आपका परिनियोजन लक्ष्य iOS 6.0 या Mac OS X 10.8 से कम है
आप उपयोग करने की आवश्यकता है dispatch_retain
और dispatch_release
अपने कतार पर। एआरसी उन्हें प्रबंधित नहीं करता है।
यदि आपका परिनियोजन लक्ष्य iOS 6.0 या Mac OS X 10.8 या बाद का संस्करण है
एआरसी आपके लिए अपनी कतार का प्रबंधन करेगी। आप (और नहीं कर सकते हैं) की जरूरत नहीं उपयोग dispatch_retain
या dispatch_release
यदि एआरसी सक्षम है।
विवरण
IOS 6.0 SDK और Mac OS X 10.8 SDK में शुरू, हर डिस्पैच ऑब्जेक्ट (सहित dispatch_queue_t
) भी एक ऑब्जेक्टिव-सी ऑब्जेक्ट है। यह <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 या मैक ओएस एक्स 10.8, और आप एआरसी सक्षम किया हुआ है , एआरसी रख सकेंगे और अपने कतार जारी है, और संकलक इच्छा झंडा उपयोग करने के लिए किसी भी प्रयास dispatch_retain
या dispatch_release
एक त्रुटि के रूप में।
अपने तैनाती लक्ष्य कम से कम है, तो आईओएस 6.0 या मैक ओएस एक्स 10.8, और आप एआरसी विकलांग है , तो आप मैन्युअल को बनाए रखने और अपने कतार छोड़ते हैं, तो चाहिए या तो फोन करके dispatch_retain
और dispatch_release
, या कतार भेजकर retain
और release
(जैसे संदेश [queue retain]
और [queue release]
)।
पुराने कोडबेस के साथ संगतता के लिए, आप कंपाइलर को अपनी पंक्ति को ऑब्जेक्टिव-सी ऑब्जेक्ट के रूप में परिभाषित करके 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
।