आईएमएचओ, जिस तरह से 'दाएं' वरीयता का विषय है। मैं ऐसे उत्तरदाताओं से असहमत नहीं हूं जो autorelease
का उपयोग न करने का समर्थन करते हैं, लेकिन मेरी प्राथमिकता autorelease
का उपयोग करना है जब तक कि एक अत्यधिक अनिवार्य कारण न हो। मैं अपने कारणों की सूची दूंगा और आप यह तय कर सकते हैं कि प्रोग्रामिंग की आपकी शैली के लिए उपयुक्त है या नहीं।
चक ने बताया कि अर्द्ध शहरी किंवदंती है कि ऑटोरेलीज पूल का उपयोग करने के लिए कुछ प्रकार का ओवरहेड है। यह सच्चाई से आगे नहीं हो सकता है, और यह कोड के प्रदर्शन के आखिरी बिट को निचोड़ने के लिए शार्क.एप का उपयोग करके अनगिनत घंटे से आता है। इसके लिए अनुकूलित करने का प्रयास करना "समयपूर्व अनुकूलन" क्षेत्र में गहरा है। यदि, और केवल तभी, शार्क.एप आपको कठिन डेटा देता है कि यह एक समस्या हो सकती है, आपको इसे देखने पर भी विचार करना चाहिए।
जैसा कि अन्य ने बताया, एक ऑटोरेलेज्ड ऑब्जेक्ट "बाद के बिंदु पर जारी किया गया" है। इसका मतलब यह है कि जब तक कि "बाद का बिंदु" चारों ओर घूमता है, तब तक वे स्मृति को ऊपर ले जाते हैं। "अधिकांश" मामलों के लिए, यह एक घटना प्रसंस्करण पास के निचले हिस्से में है जब रन लूप अगली घटना (टाइमर, उपयोगकर्ता कुछ क्लिक करना आदि) तक सो जाता है।
कभी-कभी, आपको बाद में, उन अस्थायी वस्तुओं से जल्द से जल्द छुटकारा पाना होगा। उदाहरण के लिए, आपको एक विशाल, बहु-मेगाबाइट फ़ाइल, या डेटाबेस से हजारों पंक्तियों को संसाधित करने की आवश्यकता है। जब ऐसा होता है, तो आपको एक अच्छी तरह से चुने गए बिंदु पर NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
रखना होगा, इसके बाद नीचे [pool release];
होगा। यह लगभग हमेशा किसी प्रकार के "लूप बैच प्रोसेसिंग" में होता है, इसलिए यह आमतौर पर कुछ महत्वपूर्ण पाश के प्रारंभ और नीचे होता है। फिर, यह साक्ष्य आधारित होना चाहिए, न कि आधारित आधारित। Instrument.app का ऑब्जेक्टऑलोक वह है जो आप इन परेशानियों को खोजने के लिए उपयोग करते हैं।
मुख्य कारण मैं autorelease
release
करना पसंद करते हैं, हालांकि, यह ज्यादा आसान रिसाव से मुक्त कार्यक्रमों लिखने के लिए है। संक्षेप में, यदि आप release
मार्ग जाने के लिए चुनते हैं, तो आप गारंटी कि release
अंततः सभी परिस्थितियों में, obj
को भेजा जाता है की जरूरत है। हालांकि ऐसा लगता है कि यह आसान हो सकता है, वास्तव में अभ्यास में करना आश्चर्यजनक रूप से कठिन है। अपने उदाहरण लें, उदाहरण के लिए: कुछ
// array is an instance of NSMutableArray
MyClass *obj = [[MyClass alloc] init];
[array addObject:obj];
// Assume a few more lines of work....
[obj release];
अब किसी कारण से कल्पना करो कि, कहीं, आसानी से अपने धारणा है कि array
शायद परिणामों पर कार्रवाई करने के कुछ विधि का उपयोग कर के परिणाम के रूप परिवर्तनशील है, उल्लंघन होता है और लौट आए संसाधित परिणाम वाले सरणी को NSArray
के रूप में बनाया गया था।जब आप addObject:
को उस अपरिवर्तनीय NSArray
पर भेजते हैं, तो एक अपवाद फेंक दिया जाएगा, और आप obj
को release
संदेश कभी नहीं भेजेंगे। या हो सकता है कुछ के बीच जब obj
alloc
घ था और release
करने के लिए आवश्यक कॉल, जैसे आप गलती से तुरंत कुछ की हालत और return()
जाँच क्योंकि यह अपने मन फिसल गया है कि release
करने के लिए कि कॉल पर बाद में होनी चाहिए कहीं गलत हो जाता है।
आपने अभी एक वस्तु लीक की है। और शायद यह पता लगाने की कोशिश करने के कई दिनों तक खुद को साइन अप करें कि यह कहां और क्यों लीक हो रहा है। अनुभव से, आप ऊपर दिए गए कोड को देखकर कई घंटे व्यतीत करेंगे, यह आश्वस्त है कि यह संभवतः रिसाव का स्रोत नहीं हो सकता है क्योंकि आप obj
release
भेजते हैं। फिर, कई दिनों के बाद, आप अनुभव करेंगे कि केवल एक धार्मिक epiphany के रूप में वर्णित किया जा सकता है क्योंकि आप समस्या के कारण के लिए प्रबुद्ध हैं।
// array is an instance of NSMutableArray
MyClass *obj = [[[MyClass alloc] init] autorelease];
[array addObject:obj];
// Assume a few more lines of work....
अब, यह नहीं रह गया है कि क्या होता है, क्योंकि यह गलती से obj
लीक करने के लिए लगभग असंभव है, यहां तक कि अत्यंत असामान्य या असाधारण कोने मामलों के तहत मायने रखती है:
autorelease
मामले पर विचार करें।
यदि आप चाहते हैं कि आपका कोड पूरी तरह से सुरक्षित हो, तो इसे ऑटोरेलीज़ का उपयोग करने की दृढ़ता से अनुशंसा की जाती है: http://stackoverflow.com/questions/1147785/use-autorelease-before-adding-objects-to-a-collection/1149040#1149040 देखें – Casebash