2010-05-05 16 views
9

दो परिदृश्यों को देखते हुए, कौन सा कोड सबसे अच्छा अभ्यास है और क्यों?Autorelease बनाम रिलीज

autorelease

loginButton = [[[UIBarButtonItem alloc] initWithTitle:@"Login" 
               style:UIBarButtonItemStylePlain 
               target:self 
               action:@selector(loginButtonClicked:)] 
               autorelease]; 
self.navigationItem.rightBarButtonItem = loginButton; 

या

रिलीज

loginButton = [[UIBarButtonItem alloc] initWithTitle:@"Login" 
               style:UIBarButtonItemStylePlain 
               target:self 
               action:@selector(loginButtonClicked:)]; 
self.navigationItem.rightBarButtonItem = loginButton; 
[loginButton release]; 

उत्तर

8

autorelease का उपयोग करने के खिलाफ एक कलंक प्रतीत होता है (यानी जब भी संभव हो रिलीज करना पसंद करते हैं), यही कारण है कि मैं आमतौर पर दूसरा मार्ग जाता हूं। लेकिन चूंकि आप यहां एक लूप में नहीं हैं, अब बाद में बनाम ऑटोरेलीज़िंग जारी करना बिल्कुल वही प्रभाव होगा (क्योंकि किसी अन्य ऑब्जेक्ट ने लॉगिन बटन को बरकरार रखा है, यह डेलोक() एड नहीं होगा)।

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

+3

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

+1

@Alex, इस मामले में यह सचमुच कोई फर्क नहीं पड़ता - ऑब्जेक्ट सृजन के तुरंत बाद बनाए रखा जा रहा है। जो कुछ भी होने जा रहा है वह संदर्भ गणना एक द्वारा घट जाएगी ... कौन परवाह करता है अगर वह तत्काल या कुछ समय बाद होता है? –

+0

यह केवल तभी फर्क नहीं पड़ता है जब आप स्वत: पुन: असाइन नहीं करते हैं। AutemleaseItem.rightBarButtonItem autorelease पूल जारी होने से पहले। – JeremyP

14

अपने उदाहरण के लिए, यह वास्तव में कोई फर्क नहीं पड़ता। निजी तौर पर, मैं शायद पहले मामले का उपयोग करता हूं। इससे आपको [loginButton release] लाइन को स्थानांतरित करने के बारे में चिंता किए बिना बाद में संशोधनों या डिबगिंग कोड को जोड़ने दिया जाएगा।

+1

के साथ जाने हैं downvote के लिए कोई स्पष्टीकरण में? –

+2

कोई विचार नहीं, शायद सिर्फ कोई ऐसा व्यक्ति जो दृढ़ता से पर्याप्त महसूस करता है कि आईफोन पर सभी मामलों में ऑटोरेलीज किसी भी तरह से बुरा है। मैं आपको +1 देता हूं क्योंकि आप वास्तव में पोस्ट किए गए मामले पर विचार कर रहे हैं, न केवल कंबल स्टेटमेंट जारी करते हैं। और क्योंकि मैं तुम्हारे जैसा ही महसूस करता हूं। –

+0

अच्छी तरह से पहले मामले का उपयोग करके मेरा ऐप दुर्घटनाग्रस्त हो जाता है।'- [UIBarButtonItem isSystemItem]: संदेश को आवंटित उदाहरण 0x2095f2c0' –

3

या तो आपके मामले में ठीक होगा। ऐसा इसलिए है क्योंकि UIBarButtunItem ऑब्जेक्ट स्मृति में रहता है क्योंकि इसका एक संदर्भ self.navigationItem के अंदर रखा जाता है (माना जाता है कि आपने @property (retain) के साथ उस संपत्ति को घोषित किया है।)। इसलिए, ऑटोरेलीज पूल का उपयोग करने के खिलाफ सामान्य डायट्रिब, यह वर्तमान घटना लूप के अंत तक स्मृति में अनावश्यक वस्तुओं को रखता है, यहां लागू नहीं होता है।

1

नेविगेशन के बाद से इसे बनाए रखता है, दोनों अंत समान होते हैं। स्टाइल-वार, ऑटोरेलीज उन विधियों से रिटर्न के लिए प्राथमिकता दी जाती है जो उनके नाम पर आवंटित या कॉपी नहीं करते हैं, लेकिन अन्यथा यह आपके ऊपर है। अगर ऑब्जेक्ट को अलग से नहीं रखा गया था, तो रिलीज मेमोरी को तेज़ी से मुक्त कर देगा।

रिलीज के बाद शून्य के संदर्भ को सेट करने के कोड-शैली मुद्दे एक संबंधित प्रश्न है।

2

चूंकि आप आईफोन पर बहुत सख्त स्मृति बजट पर हैं, इसलिए पसंदीदा तरीका स्पष्ट रिलीज के माध्यम से होना चाहिए। इस तरह ऑब्जेक्ट्स तब तक चिपकते नहीं हैं जब तक ऑटोरलीज पूल रनलोप के दौरान खाली नहीं हो जाता है और आप जितनी छोटी हो सके अपनी मेमोरी पदचिह्न को रखने में सक्षम होते हैं।

+2

यह आलोचना केवल अस्थायी "फेंकने" वस्तुओं के लिए मान्य है जो उस क्षेत्र में नहीं टिकेगी जिसमें वे बनाए गए थे। जब आप एक ऑब्जेक्ट बना रहे हैं जो लंबे समय तक संग्रहीत है, तो इससे कम अंतर होता है, क्योंकि ऑब्जेक्ट अभी भी रिलीज़ होगा या ऑटोरेलीज के आसपास होगा। ऐसे मामलों में, यह वरीयता का विषय है। –

0

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

0

हालांकि प्रस्तुत परिदृश्य दो मामलों समान हैं लेकिन वहाँ autorelease.So से अधिक रिहाई (reference) उपयोग करने के लिए एक मामूली गति फायदा है जब वहाँ सख्त प्रदर्शन की आवश्यकताओं को रिलीज

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