मैं स्मृति प्रबंधित कोड में नया हूं लेकिन मुझे विचार बहुत अच्छी तरह से मिलता है।उद्देश्य सी रिलीज, ऑटोरेलीज, और डेटा प्रकार
XCode में लीक उपकरण के माध्यम से अपने एप्लिकेशन लेने पर, मैंने देखा मैं सिर्फ अपने कस्टम वस्तुओं को साफ करने के लिए किया था, लेकिन नहीं गतिशील रूप से उदाहरण के लिए सरणियों बनाया, तो मैं समझ उन डेटा प्रकार autoreleased कर रहे हैं - समझ में आता है के बाद से मैं केवल था उन सरणी को रिलीज़ करने के लिए जिन्हें मैंने उन गुणों के रूप में उपयोग किया था जिन पर एक (बनाए रखा) था। मैं एक निश्चित सरणी इस तरह प्रारंभ पर एक रिसाव हो रही थी:
तो मैं कुछ अजीब देखा
NSMutableArray *removals = [NSMutableArray new];
नहीं बल्कि एक ऐसी ही एक
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:9];
अब, कारण एक स्थापित किया गया था "नया" यह है कि इसमें 0-99 आइटम हो सकते हैं, जबकि दूसरा मुझे पता था कि 9 हमेशा होने वाला था। चूंकि दोनों एरे बाद में एक ही विधि में पास हो जाते हैं, उपयोगकर्ता इंटरैक्शन के आधार पर, मुझे या तो रिसाव मिल रहा था अगर मैंने विधि के अंत में रिलीज़ नहीं किया, या अपवाद अगर मैंने किया!
मैं
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];
को पहली सरणी बदल गया है और मेरे पास कोई लीक हो जाते हैं और कुछ भी रिलीज करने के लिए नहीं है। क्या कोई समझा सकता है?
** उन सभी विधियों में से एक ** एक वस्तु को 1 की रखरखाव के साथ वापस कर देता है। अंतर यह है कि कुछ के साथ आप ऑब्जेक्ट का स्वामी हैं और इस प्रकार इसे रिलीज़ करने की आवश्यकता है, और दूसरों के साथ आपके पास नहीं है ऑब्जेक्ट और इसे रिलीज़ करने की आवश्यकता नहीं है (लेकिन वर्तमान कॉल श्रृंखला के आसपास होने पर भी इसकी गणना नहीं हो सकती है)। – Chuck
कड़ाई से बोलते हुए, नहीं, वे एक कार्यान्वयन विस्तार नहीं करते हैं। कई मामलों में वे अलग-अलग रखरखाव की गणना के साथ चीजें वापस कर देते हैं। उदाहरण के लिए = [UIImage imageNamed:] कुछ बड़े बड़े रखरखाव के साथ कुछ वापस कर सकता है क्योंकि यह एक कैश की गई छवि का पुन: उपयोग कर सकता है। –
ठीक है, हां, बरकरार गिनती ही एक कार्यान्वयन विस्तार है। ऐप्पल के दस्तावेज़ जितना कहते हैं। और ओएस एक्स के मौजूदा संस्करणों पर, ऊपर सूचीबद्ध सभी मामलों में, इस कार्यान्वयन के विवरण का मूल्य 1. – Chuck