12

(लेकिन इस सवाल का पूरी तरह से अलग है)क्या मुझे कभी भी एआरसी के तहत dispatch_release को कॉल करना है?

इस गैर एआरसी कोड उदाहरण एक GCD आधारित टाइमर सेट और यह एक dispatch_source_t वस्तु के लिए dispatch_release कॉल:

__block BOOL done = NO; 
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); 
    if (timer) { 
     uint64_t milliseconds = 100ull; 
     uint64_t interval = milliseconds * NSEC_PER_MSEC; 
     uint64_t leeway = 10ull * NSEC_PER_MSEC; 
     __block typeof(self) _self = self; 

     dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway); 
     dispatch_source_set_event_handler(timer, ^{ 
      //[_progressBar setProgress:exportSession.progress animated:YES]; 
      if (done) { 
       dispatch_source_cancel(timer); 
       dispatch_release(timer); 
       _self.exportingMovieLabel.hidden = YES; 
       _self.exportingProgress.hidden = YES; 
      } 
     }); 

     dispatch_resume(timer); 
    } 

मुझे पता चला है कि आप कतार एआरसी के तहत वस्तुओं को जारी करने की आवश्यकता नहीं है। लेकिन अन्य जीसीडी वस्तुओं को एक प्रेषण स्रोत की तरह?

+1

दावा किया गया "डुप्लिकेट प्रश्न" भी करीब नहीं है। जवाब विशेष रूप से जीसीडी कतारों के बारे में बात करते हैं। यह सवाल विशेष रूप से पूछता है कि क्या यह अन्य जीसीडी वस्तुओं के लिए सच है। – openfrog

+2

इसे आज़माएं। यदि आवश्यक नहीं है तो यह कंपाइलर आपको नहीं देगा (यह नहीं है)। –

+1

मेरे अनुभव में, ऐप्पल प्रलेखन हमेशा उल्लेख करता है कि आपको इसके आवश्यक रिलीज को प्रबंधित करने की आवश्यकता है। आमतौर पर, रिलीज करने के लिए विशिष्ट कार्य होते हैं। इस मामले में, दस्तावेज़ों को पढ़ना, ऐसा लगता है कि यह उपयोग पर निर्भर करता है कि आपको खुद को रिलीज़ करने की आवश्यकता है या नहीं। मैं इसका मतलब यह मानता हूं कि यदि आप dispatch_retain का उपयोग करते हैं और पॉइंटर पर पकड़ते हैं, तो आपको इसे स्वयं रिलीज़ करने की आवश्यकता होगी। मैंने इस समारोह का उपयोग नहीं किया है, हालांकि, इसे नमक के अनाज के साथ लें। –

उत्तर

7

नहीं, बशर्ते कि आपका परिनियोजन लक्ष्य आईओएस 6.0 या मैक ओएस एक्स 10.8 या बाद में है, जैसा कि here समझाया गया है।

सभी जीसीडी वस्तुओं को एआरसी द्वारा प्रबंधित किया जाता है, इसलिए आपको उनकी स्मृति को स्पष्ट रूप से प्रबंधित करने की आवश्यकता नहीं है। dispatch_queue_t के लिए भी सही क्या है अन्य सभी जीसीडी वस्तुओं पर भी लागू होता है।

यह <os/object.h> में OS_OBJECT_HAVE_OBJC_SUPPORT की परिभाषा से ऊपर दस्तावेज है।

डिफ़ॉल्ट रूप से, जीसीडी और एक्सपीसी ऑब्जेक्ट्स जैसे libSystem ऑब्जेक्ट्स को उद्देश्य-सी प्रकार के रूप में घोषित किया जाता है जब उद्देश्य-सी कंपाइलर के साथ निर्माण होता है। इससे उन्हें एआरसी में भाग लेने की अनुमति मिलती है, ब्लॉक रनटाइम द्वारा आरआर प्रबंधन में और स्थिर विश्लेषक द्वारा जांच की गई लीक में, और उन्हें कोको संग्रह में जोड़ने में सक्षम बनाता है।

आप -DOS_OBJECT_USE_OBJC=0 कंपाइलर ध्वज का उपयोग करके इस व्यवहार से ऑप्ट-आउट भी कर सकते हैं।

1

यहां आपके कोड में जोड़ने के लिए संकलक निर्देश है।

// If GCD objects are treated as Objective C object then we do not need to call dispatch_release on those GCD object. 
// Checking if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 ensures we are only releasing GCD objects when they are NOT being treated as Objective C objects. 
#if OS_OBJECT_HAVE_OBJC_SUPPORT == 0 
    dispatch_release(timer); 
#endif 
संबंधित मुद्दे