2009-11-19 17 views
6

मैं अक्सर देखता हूं जब हम अब ऑब्जेक्ट को छोड़ देते हैं तो हम इसे तुरंत शून्य पर सेट करते हैं। मुझे पता है कि रिलीज और शून्य दोनों वस्तु से जुड़े पुराने मूल्य को मुक्त करते हैं लेकिन रिलीज के मामले में यह ऑब्जेक्ट को एक खतरनाक सूचक के रूप में छोड़ देता है, इसलिए हमें इसे शून्य पर सेट करना होगा।हमें क्यों जारी करना चाहिए?

तो मेरा सवाल यह है कि अगर नील ऑब्जेक्ट के पुराने मूल्य को मुक्त करता है और ऑब्जेक्ट को शून्य पर सेट करता है तो हमें केवल नील का उपयोग क्यों नहीं करना चाहिए, क्यों रिलीज का उपयोग करना चाहिए।

Way1:

MyClass *obj = [[MyClass alloc] init]; 
[obj release]; 
obj = nil; 

Way2:

MyClass *obj = [[MyClass alloc] init]; 
obj = nil; 

क्या way1 और way2 में वास्तविक अंतर है, तो उपयोग way1 क्यों केवल way2 का उपयोग नहीं करते है?

+1

अच्छा सवाल .. – tek3

उत्तर

11

शून्य पर पॉइंटर सेट करना उस पॉइंटर के पूर्व गंतव्य द्वारा कब्जा कर लिया गया स्मृति जारी नहीं करता है। सादे अंग्रेजी में, इसे पर जारी करने के लिए इसे निर्दिष्ट नहीं करता है।

यदि आपका आवेदन कचरा इकट्ठा किया गया है, तो रिलीज एक नो-ऑप है और इसे छोड़ा जा सकता है। अन्यथा, यह बहुत जरूरी है। इसलिए, रास्ता 1 हमेशा सही होता है, और वे 2 कचरा संग्रह के तहत ही सही होता है।

नोट: यह उत्तर स्वत: संदर्भ गणना का उपयोग कर परियोजनाओं पर लागू नहीं होता है। एआरसी के तहत, को पॉइंटर सेट करने से ऑब्जेक्ट को रिलीज़ भेजता है।

+4

वहाँ एक उल्लेखनीय अपवाद यहाँ है: ** तो ** यह एक उदाहरण चर रहा है ** और ** यह घोषित किया गया है '@property (बनाए रखें)' ** और ** आपके पास एक्सेसर्स को 'संश्लेषित' किया गया है, तो उन एक्सेसर विधियों को आपके द्वारा असाइन की गई वस्तुओं को बनाए रखने और रिलीज़ करने का ख्याल रखेगा। बेशक, यह केवल तभी काम करता है जब आप एक्सेसर विधियों का उपयोग करते हैं: '[self setObj: nil] 'या' self.obj = nil' (objc-2.0 में)। –

1

यह बीजे ने कहा है कि इसे शून्य पर स्थापित करने से स्मृति को मुक्त नहीं किया जाएगा, और गैर-जीसी एकत्रित वातावरण में स्मृति रिसाव होगा। एक वैकल्पिक कि संभवतः रूप में अच्छी तरह मान्य होना था हो सकता है

MyClass *obj = [[[MyClass alloc] init] autorelease]; 

obj = nil; 
संबंधित मुद्दे