कहीं मुझे लगता है कि पढ़ रहा था - कम स्मृति चेतावनी के बारे में और सभी यह subviews के साथ एक गैर दृश्य दृश्य (= एक पूरी निब, मुझे लगता है) को देने, आप ऐसा करना चाहिए:मुझे क्यों लिखना चाहिए [anView रिलीज], anView = nil; [anView रिलीज] के बजाय ;?
-(void)dealloc {
[anView release], anView = nil;
[someImageView release], someImageView = nil;
[super dealloc];
}
बजाय
-(void)dealloc {
[anView release];
[someImageView release];
[super dealloc];
}
रिलीज कॉल करने के बाद उन पॉइंटर्स को शून्य (= "कोई ऑब्जेक्ट") ग्राउंड करने का कारण क्या है? मुझे लगता है: कुछ अन्य तरीकों से कुछ कारणों के लिए दृश्य को देखा जा सकता है (किसी के लिए यह कोई उदाहरण हो सकता है?), तो didReceiveMemory चेतावनी की बात होती है, और आप एक संपूर्ण nib + दृश्य जारी करते हैं जो वर्तमान में दिखाई नहीं दे रहा है (यानी एक मल्टीव्यू-ऐप में)। जैसे ही उपयोगकर्ता फिर से उस दृश्य को देखना चाहता है, आप फिर से निब को लोड करेंगे और फिर: यह सभी विचारों को लोड करता है, आउटलेट को जोड़ता है, और बैंग! आपके अन्य बनाए गए दृश्य अब मेमोरी ईंट में कहीं अकेले किसी भी पॉइंटर के बिना लटक रहे हैं, जिससे आपका ऐप दुर्घटनाग्रस्त होने तक वसा और गहरी मेमोरी लीक हो जाती है।
सही/गलत?
नहीं। यह स्पष्ट रूप से * एप्पल द्वारा निषिद्ध है, और कुछ परिस्थितियों में दुर्घटना का कारण बनने का एक अच्छा तरीका है। Http://stackoverflow.com/questions/192721/why-shouldnt-i-use-obective-c-2-0-accessors-in-init-dealloc –
यह लिंक एक अच्छा बिंदु लाता है, लेकिन यह अभी भी एक है बुरा विचार अगर आप केवल इसे रीडराइट गुणों के लिए उपयोग करते हैं जो पूरी तरह संश्लेषित हैं? (जिसका अर्थ है कि आप किसी संपत्ति के लिए संश्लेषण की घोषणा नहीं करते हैं और अभी भी गेटर या सेटर को ओवरराइड करते हैं) – Kevlar
यह संभवत: ठीक है, पूरी तरह से संश्लेषित गुणों के साथ। लेकिन ऐप्पल इसकी गारंटी नहीं देता है कि इसकी अनुमति है और इसके खिलाफ सिफारिश की जाती है, इसलिए यह भविष्य में एसडीके में तोड़ सकता है। –