2009-03-09 9 views
9

यह वह जगह है नहीं एक कचरा एकत्र पर्यावरणबनाम रिलीज नहीं के बराबर एक वस्तु की स्थापना + realloc

मैं एक वर्ग उदाहरण चर जो मेरे क्रम में कुछ बिंदु पर, मैं एक अलग डेटा सेट की तुलना में यह था के साथ फिर से प्रारंभ करने की आवश्यकता है मूल रूप से बनाया गया।

hypothetically बोल, क्या हुआ अगर मैं एक NSMutableArray या एक NSMutableDictionary है, इसे और अधिक इस तरह के रूप में कुछ करने की कुशल होगा:

[myArr release]; 
myArr = [[NSMutableArray alloc] init....]; 

या बस,

myArr = nil; 

वस्तु जारी myArr करेंगे और मेमोरी में भंडारण के लिए मुझे पॉइंटर के बिना छोड़ दें ताकि मैं myArr का पुनः उपयोग कर सकूं?

उत्तर

21

यदि आप myArr=nil; स्वयं ही करते हैं, तो आप उस पॉइंटर को खो चुके हैं जिस पर आप release संदेश भेज सकते हैं। आपकी ऑब्जेक्ट release पर कोई जादू नहीं है।

और, जैसा कि जॉर्ज कहते हैं, आपकी वस्तु को छोड़ने में सक्षम होने के बिना, उस स्मृति को 'लीक' किया गया है।

+1

और वहाँ स्मृति रिसाव है। –

1

अंतर का एहसास करने का एक तरीका यह हो सकता है: किसी ऑब्जेक्ट को संदर्भ में सेट करने से ऑब्जेक्ट में कुछ भी नहीं होता है, यह केवल संदर्भ के लिए कुछ करता है।

"ऑब्जेक्ट जारी करना" कुछ भी नहीं है, इसलिए ऐसा नहीं होता है। :) एक कचरा-एकत्रित भाषा में यह संदर्भ को छोड़ने के दुष्प्रभाव के रूप में ऐसा कर सकता है, लेकिन उद्देश्य सी में यह इस तरह से काम नहीं करता है।

5

यदि आप मैक ओएस पर थे, नहीं iPhone OS मैं कहूंगा कि उस पर कचरा कलेक्टर या सक्रिय है या नहीं निर्भर करता है:

    जीसी साथ
  • : myArr = nil;
  • का उपयोग जीसी बिना: का उपयोग [myArr release];

दुर्भाग्यवश, आईफोन पर, कोई कचरा संग्रह नहीं है, इसलिए यदि आप मेमोरी लीक नहीं चाहते हैं, तो आपको इसकी आवश्यकता होने के बाद अपने ऑब्जेक्ट को रिलीज़ करना होगा।

+0

आईफोन पर कोई जीसी नहीं। – Abizern

+0

हाँ आप सही हैं। मैं मैक ओएस पर बहुत ध्यान केंद्रित कर रहा हूं ... मेरा जवाब अपडेट किया गया है। – mouviciel

+0

आपको इसे शून्य पर सेट करने की भी आवश्यकता नहीं है, क्योंकि यह ज्यादातर डेलोक कोड में होता है जब उसके सभी लिंक के साथ ऊपरी वस्तु एकत्र की जाती है। –

6

आप एक संपत्ति का उपयोग कर सकते हैं और मेमोरी रिसाव के बिना लगभग सिंटैक्स प्राप्त कर सकते हैं। सरणी घोषित करने के लिए

इस वाक्य का प्रयोग करें

@property (readwrite, retain) NSMutableArray *myArray; 

तो यह इस तरह को पुनः आरंभ कर:

[self setMyArray:[NSMutableArray array]]; 
+0

या डॉट-प्रॉपर्टी सिंटैक्स का उपयोग करने के लिए: self.myArray = [NSMutableArray array]; –

+0

के रूप में myArray एक म्यूटेबल ऑब्जेक्ट को इंगित करता है, बेहतर फॉर्म @property (readwrite, copy) होगा NSMutableArray * myArray – Abizern

1

तो आप क्या चाहते हैं एक NSMutableArray/NSMutableDictionary की सामग्री को पुनर्स्थापित करने के लिए है, आप कर सकते हैं RemoveAllObjects को भी कॉल करें और आपके पास काम करने के लिए एक ताजा सरणी/dict है।

4

पहला कोड ब्लॉक ठीक है। हालांकि, दूसरा ब्लॉक आपको एक सरणी के साथ नहीं छोड़ता है जिसका उपयोग आप कर सकते हैं ताकि यह पर्याप्त न हो। आधा हिस्सा उस ब्लॉक को सही करने, मुझे लगता है कि आप का मतलब:

myArr = nil; 
myArr = [[NSMutableArray alloc] init....]; 

हालांकि, यह पूरा नहीं है कि आप क्या चाहते हैं क्योंकि या तो आपने myArr को रिहा नहीं कर रहे हैं।यदि आपने myArr के लिए एक सेटटर संश्लेषित किया है, तो आप पॉइंटर को सीधे (myArr) तक पहुंचने के बजाय सेटटर (self.myArr) का उपयोग करके रिलीज व्यवहार को शून्य से सेट करना चाहते हैं। अपने दूसरे खंड को पूरी तरह से ठीक करना:

self.myArr = nil; 
myArr = [[NSMutableArray alloc] init....]; 

अब हम बराबर कोड उदाहरण है, नहीं के बराबर के साथ एक सेटर का उपयोग कर छोड़ दें, अन्य नहीं है। वह एक जैसे है।

तो myArr इन उदाहरणों में के रूप में एक अस्थायी सरणी है, सबसे कारगर विधि removeAllObjects उपयोग करने के लिए, स्मृति जारी करने की सभी काम से परहेज ही इसे वापस दावा करने के लिए है:

[myArr removeAllObjects]; 
+0

पुन :: 2: इसके अलावा, आप नए सरणी के साथ सेटर का उपयोग भी कर सकते हैं (एक ऑटोरेलेज्ड सरणी पास कर रहे हैं, '[NSMutableArray सरणी] '), और उसके बाद इसे भरने के लिए सरणी एक्सेसर्स का उपयोग करें। http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ModelObjects/Articles/moAccessorMethods.html बेशक, यदि आप तुरंत नई सरणी को पॉप्युलेट करने जा रहे हैं, तो यह करने में अधिक सक्षम होगा कि एक स्थानीय चर में नई सरणी के साथ, फिर संपत्ति को समाप्त सरणी पर सेट करें। और इनमें से किसी भी विधि को संपत्ति को 'शून्य' पर सेट करने की आवश्यकता नहीं होगी। –

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