एआरसी प्रेषण कतारों का समर्थन करता है?


95

मैं सेब के प्रलेखन "डिस्पैच क्यू के लिए मेमोरी मैनेजमेंट" के बारे में पढ़ रहा हूं:

यहां तक ​​कि अगर आप कचरा एकत्र करने वाले आवेदन को लागू करते हैं, तो भी आपको अपनी डिस्पैच क्यु और अन्य प्रेषण वस्तुओं को बनाए रखना होगा और जारी करना होगा। ग्रैंड सेंट्रल डिस्पैच मेमोरी को पुनः प्राप्त करने के लिए कचरा संग्रह मॉडल का समर्थन नहीं करता है।

मुझे पता है कि एआरसी एक कूड़ा उठाने वाला नहीं है, लेकिन मैं यह सुनिश्चित करना चाहूंगा कि मुझे अपने डिस्पैच_क्व्यू_टी को डिस्पैच करने और भेजने की जरूरत नहीं है।

जवाबों:


234

संक्षिप्त जवाब: हाँ, एआरसी बरकरार है और प्रेषण कतार जारी करता है।







और अब लंबे उत्तर के लिए ...

यदि आपका परिनियोजन लक्ष्य 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


1
हालाँकि, ध्यान दें कि नया परिवर्तन ऑब्जेक्ट को ऑब्जेक्ट-सी ऑब्जेक्ट के रूप में भेजता है। इस प्रकार, भले ही एआरसी अक्षम हो, इन वस्तुओं को एक ब्लॉक द्वारा कब्जा कर लिया जाने पर स्वचालित रूप से बनाए रखा जाएगा - बस अन्य सभी ऑब्जेक्ट-सी ऑब्जेक्ट्स की तरह।
जोड़ी हगींस

3
एक दिलचस्प बढ़त का मामला है। यदि आपकी लाइब्रेरी iOS 5.1 और आपके ऐप से 6.0 पर आती है और आप ARC का उपयोग कर रहे हैं, तो आपको अपने 5.1 कोड में ऑब्जेक्ट dispatch_release और NULL उसकी आवश्यकता है dealloc। अन्यथा, कुछ (संकलक द्वारा उत्पन्न कोड? रनटाइम ही?) ऑब्जेक्ट को दूसरी बार जारी करने का प्रयास करेगा।
स्टीवन फिशर

क्या मुझे मैक ओएस 10.7 का उपयोग करते समय अपने द्वारा बनाई गई अन्य स्रोत वस्तुओं को भेजने की आवश्यकता है?
p0lAris 19

आपको ओएस एक्स 10.7 के तहत सभी जीसीडी ऑब्जेक्ट को मैन्युअल रूप से बनाए रखना / जारी करना होगा।
डकैती

23

बस यहाँ एक अनुसरण करें ... यदि आपका न्यूनतम परिनियोजन लक्ष्य iOS 6 है, तो ARC अब उन्हें प्रबंधित करता है।


यह माउंटेन लायन पर भी लागू होता है। यदि आपका परिनियोजन लक्ष्य iOS 6 या माउंटेन लायन है, तो आप (डिफ़ॉल्ट रूप से) dispatch_release का उपयोग नहीं कर सकते हैं क्योंकि यह एक मैक्रो है जो उस ऑब्जेक्ट को रिलीज़ संदेश भेजता है जिसे ARC के तहत अनुमति नहीं है।
एमिल एरिकसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.