बनाम रिहाई + realloc नहीं के बराबर एक वस्तु की स्थापना

वोट
9

यह एक कचरा एकत्र वातावरण नहीं है

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

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

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

या केवल,

myArr = nil;

myArr वस्तु रिलीज और स्मृति में भंडारण कर सकते हैं तो मैं फिर से उपयोग myArr के सूचक के बिना मुझे छोड़ देंगे?

09/03/2009 को 17:03
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
21

यदि आप करते हैं myArr=nil;अपने आप में है, तो आप सूचक जो करने के लिए आप भेज सकते हैं खो दिया है releaseकरने के लिए संदेश। वहाँ के लिए कोई जादू नहीं है releaseअपने वस्तु।

और, जॉर्ज कहते हैं, अपने वस्तु जारी करने के लिए सक्षम किया जा रहा बिना, कि स्मृति 'लीक' किया है।

09/03/2009 को 17:07
का स्रोत उपयोगकर्ता

वोट
6

आप एक संपत्ति का उपयोग करें और स्मृति रिसाव के बिना लगभग वाक्य रचना आप चाहते हैं मिल सकता है।

सरणी घोषित करने के लिए इस वाक्य का प्रयोग करें

@property (readwrite, retain) NSMutableArray *myArray;

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

[self setMyArray:[NSMutableArray array]];
09/03/2009 को 17:59
का स्रोत उपयोगकर्ता

वोट
5

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

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

दुर्भाग्य से, iPhone पर, वहाँ कोई कचरा संग्रहण है, इसलिए यदि आप मेमोरी लीक नहीं करना चाहते, तो आप अपने वस्तु जारी करने के लिए एक बार आप इसे नहीं की जरूरत है।

09/03/2009 को 17:13
का स्रोत उपयोगकर्ता

वोट
4

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

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

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

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

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

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

[myArr removeAllObjects];
02/12/2009 को 11:08
का स्रोत उपयोगकर्ता

वोट
1

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

13/03/2009 को 22:37
का स्रोत उपयोगकर्ता

वोट
1

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

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

09/03/2009 को 17:09
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more