2012-01-21 12 views
5

मैं आईओएस 5 और एआरसी में नया हूं, इसलिए मेरा मूर्ख सवाल क्षमा करें।मेमोरी लीक्स पर स्वचालित संदर्भ गणना (एआरसी) का प्रभाव

अगर हम अपने प्रोजेक्ट में एआरसी का उपयोग करते हैं, तो इसका मतलब यह है कि कोई मेमोरी लीक नहीं होगा।

अगर हम एआरसी का उपयोग करते हैं तो मेमोरी लीक और एनएसजेम्बी का पता लगाने के लिए उपकरण का उपयोग करने की आवश्यकता है?

+0

नहीं, एआरसी पूरी तरह मेमोरी लीक को खत्म नहीं करेगा। देखें [उद्देश्य-सी के स्वचालित संदर्भ गिनती (एक्सकोड 4.2 में) किस तरह की रिसाव को रोकता/छोटा नहीं करता है?] (Http://stackoverflow.com/questions/6260256/what-kind-of-leaks-does-objective-cs - स्वचालित-संदर्भ-गिनती-इन-एक्सकोड -4-2) – BoltClock

उत्तर

5

एआरसी आपको कुछ प्रकार के रिसाव को खत्म करने में मदद करेगा, क्योंकि आप release या autorelease एकल ऑब्जेक्ट्स को नहीं भूलेंगे। उदाहरण के लिए, इस प्रकार की त्रुटि असंभव हो जाती है:

myLabel.text = [[NSString alloc] initWithFormat:@"%d", 17]; 
// oops, just leaked that NSString! 

हालांकि, एआरसी चक्र बनाए रखने के कारण लीक को खत्म नहीं करेगा। कमजोर संदर्भों का उपयोग करके या चक्रों को मैन्युअल रूप से तोड़ने से पहले चक्र को तोड़कर, चक्रों को बनाए रखने के लिए यह अभी भी आपके ऊपर है। उदाहरण के लिए, जैसे ही हम ब्लॉक का अधिक उपयोग करना शुरू करते हैं, ब्लॉक/स्वयं बनाए रखने वाले चक्र अधिक आम हो जाते हैं। Transitioning to ARC Release Notes कमजोर संदर्भों का उपयोग करके इन चक्रों से बचने के तरीके पर चर्चा करें।

+1

यदि आप एआरसी को समझना चाहते हैं, तो मैं [डब्ल्यूडब्ल्यूडीसी 2011] (https://developer.apple.com/videos/wwdc/2011/) से "स्वचालित संदर्भ गणना" वीडियो की अत्यधिक अनुशंसा करता हूं। –

+0

मैं इस प्रश्न की स्थिति में क्या कर सकता हूं http://stackoverflow.com/questions/21423309/memory-leak-in-nsstring-stringwithutf8string-with-arc-enabled – deltaaruna

0

नहीं, यह स्मृति रिसाव होने से नहीं रोकता है। संदर्भ गणना के साथ रनटाइम में क्या होता है, यह है कि कभी-कभी आपका कोड संदर्भों को लटकता है, और फिर वस्तुओं को मुक्त नहीं किया जाता है। अच्छा कोड लिखने के लिए अभी भी आप पर निर्भर है।

+0

ठीक है। तो क्या NSZombies के लिए भी वही बात लागू होगी? – meetpd

0

अगर हम अपने प्रोजेक्ट में एआरसी का उपयोग करते हैं, तो इसका मतलब यह है कि कोई मेमोरी लीक नहीं होगा।

अभी भी लीक हो सकता है - आपके प्रोग्राम में और आपके द्वारा उपयोग की जाने वाली पुस्तकालयों में। साथ ही, एआरसी केवल ओबीजेसी ऑब्जेक्ट्स पर लागू होता है - आप आसानी से किसी भी ढेर आवंटन को रिसाव कर सकते हैं जो ओबीजेसी ऑब्जेक्ट नहीं है (उदा। malloc/new)।

अगर हम एआरसी का उपयोग करते हैं तो मेमोरी लीक और एनएसजेम्बी का पता लगाने के लिए उपकरण का उपयोग करने की आवश्यकता है?

हां। पिछली प्रतिक्रिया में विस्तार होना चाहिए कि आपके प्रोग्राम को इन समस्याओं से मुक्त होने की गारंटी क्यों नहीं है। साथ ही, यदि आप मूर्ख चीजें करते हैं तो संकलक इसे गलत कर सकता है, और यदि आप अपने डेटा को सही तरीके से सुरक्षित नहीं करते हैं (उदाहरण के लिए समवर्ती निष्पादन) तो आप निश्चित रूप से समस्याएं पैदा कर सकते हैं।

संबंधित मुद्दे