2010-11-18 14 views
6

में यह एक रिलीज संदेश भेजने शून्य बनाम करने के लिए एक वस्तु की स्थापना के बीच का अंतर है मेरे पास है वस्तु:क्या dealloc

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

क्या बीच का अंतर है:

[obj release]; // Only obj own this object. 

और:

obj = nil; 

करता आईओएस deallocs obj जब मैं सेट obj = नहीं के बराबर?

मैं कुछ समय मैं इसे एक वस्तु को इंगित निर्धारित करते हैं, कुछ समय नहीं है एक सूचक है,। तो, जब मैं एक पॉइंटर जारी करना चाहता हूं तो मुझे यह जांचना चाहिए कि यह शून्य है?

उत्तर

13

पिछले दशक से यह जवाब है,

केवल ऐतिहासिक ब्याज की अब है।

आज, आप एआरसी उपयोग करना चाहिए।

चीयर्स


बहुत संक्षिप्त उत्तर है DO सिर्फ शून्य पर सेट नहीं। आपको इसे जारी करना होगा। इसे शून्य पर सेट करने से इसे जारी करने के लिए कोई संबंध नहीं है। आपको इसे छोड़ना होगा।

लेकिन यह याद है कि अगर यह एक संपत्ति, तो है

self.obj = nil; 

एक वास्तव में यह आप के लिए जारी करेंगे लायक है। बेशक, आपको "स्वयं" को नहीं भूलना चाहिए। अंश !!!!

दरअसल,

self.obj = anyNewValue; 

वास्तव में पुराने स्मृति आप के लिए, स्वच्छ सब कुछ जादुई जारी करने और इसे सेट अप नए मान के साथ होगा। तो, self.obj = nil बस इसका एक विशेष मामला है, यह सबकुछ जारी करता है और साफ करता है और फिर इसे शून्य पर छोड़ देता है।

तो अगर पढ़ने के लिए इस नए और पूरी तरह से स्मृति से उलझन में है किसी को भी,

  1. आप इसे, [x रिहाई] यदि नहीं के बराबर एक्स = शून्य

  2. को सेट करने से पहले रिलीज करना चाहिए आप एक संपत्ति का उपयोग कर रहे हैं, "स्वयं को मत भूलना।"

  3. आईएफ आप एक संपत्ति का उपयोग कर रहे हैं, तो आप केवल self.x = nil या वास्तव में कह सकते हैं f.x = कुछ नया और यह रिलीज करने और अन्य सभी जटिल परेशान सामानों का ख्याल रखेगा।

  4. आखिरकार आपको रिलीज, ऑटोरेलीज, ब्ला ब्ला ब्लाह के बारे में सभी जटिल चीजें सीखनी होंगी। लेकिन जीवन कम है, अब के लिए इसके बारे में भूल जाते हैं: -/

आशा है कि यह किसी को मदद मिलती है।

फिर से ध्यान दें, यह पोस्ट अब पूरी तरह से गलत है। एआरसी का प्रयोग करें।

केवल ऐतिहासिक रुचि।

+0

जादुई रूप से जारी किए जाने वाले गुणों के बारे में थोड़ा सा सच नहीं है। यदि आप "बनाए रखने" विशेषता के साथ एक संपत्ति घोषित करते हैं तो आपको इसे स्वयं जारी करना होगा, केवल तभी जब आप इसे "प्रतिलिपि" विशेषता के साथ घोषित करते हैं, तो यह आपके लिए वर्णित तरीके से जारी किया जाता है। Http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html – dertoni

+0

मुझे लगता है कि उसका अर्थ "असाइन" होना चाहिए, न कि "बनाए रखना"। इसके अलावा, self.obj = someNewValue नहीं होगा, केवीओ श्रोताओं को ट्रिगर करें? –

+1

स्पष्टीकरण के लिए, self.obj = newValue पुराने मान को जारी करता है, यदि आप गुणों का सही उपयोग कर रहे हैं। मैं यह जोड़ना चाहता हूं कि self.obj = newValue [self setObj: newValue] के समान है, जो रिलीज़ होता है (setObj विधि में [oldValue रिलीज़] है)। साथ ही, यदि आप ऑब्जेक्ट को जारी कर रहे हैं, तो क्या आप केवीओ को ट्रिगर नहीं करना चाहते हैं? – andyvn22

5

आईओएस कचरा संग्रहण, जिसका अर्थ है कि obj = nil कर एक स्मृति रिसाव में परिणाम होगा समर्थन नहीं करता। आप आवंटन रद्द करने से अधिक स्वत: नियंत्रण चाहते हैं, तो आप की तरह कुछ करना चाहिए: obj = [[[NSObject alloc] init] autorelease] (आप चाहिए नहीं यह रिलीज आप ऐसा करते हैं)। Autorelease वर्तमान NSRunloop ईवेंट समाप्त होने पर ऑब्जेक्ट को स्वचालित रूप से रिलीज़ होने का कारण बन जाएगा। NSRunloop स्वचालित रूप से प्रत्येक घटना पुनरावृत्ति के लिए अपने NSAutoReleasePool को हटा देता है, जो आमतौर पर बहुत उपयोगी होता है।

+0

मेरे पास एक सूचक है, कभी-कभी मैं एक वस्तु को इंगित करता हूं, कभी-कभी मैं ऐसा नहीं करता हूं। तो, जब मैं एक पॉइंटर जारी करना चाहता हूं तो मुझे यह जांचना चाहिए कि यह शून्य है? –

+1

आपको रिलीज पर शून्य की जांच क्यों करनी है? यह एक शून्य सूचक को संदेश भेजने के उद्देश्य से सी में पूरी तरह मान्य है, यह कुछ भी नहीं करता है। आपको हमेशा पॉइंटर को प्रारंभ करना चाहिए, शून्य या कुछ अन्य वैध ऑब्जेक्ट में। – ImHuntingWabbits

+0

मुझे समझ में नहीं आता कि रिलीज से पहले शून्य के लिए जांच करना क्यों अच्छा विचार है। शून्य को रिहाई भेजना पूरी तरह से मान्य है, और "वास्तविक" गैर-शुरुआती कोडर इसे हर समय करते हैं। सामान्य अभ्यास स्वीकार किए जाने वाले किसी चीज़ से बचने के लिए क्यों सीखें? – andyvn22

2

ऑब्जेक्ट शून्य सेट करना एक स्मृति रिसाव (यदि आप आवंटन, रखरखाव या प्रतिलिपि द्वारा स्वामित्व ले रहे हैं) बनाते हैं क्योंकि हमारे पास उस विशेष स्मृति स्थान पर सूचक नहीं है।

इसलिए यदि आप किसी ऑब्जेक्ट को हटाना चाहते हैं तो आपको रिलीज विधि को कॉल करके इसे ऑब्जेक्ट के सभी स्वामित्व को लेना होगा।

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