तुम क्या अब सबसे अच्छा अभ्यास माना जाता है का पालन करें, तो आप चाहिए रिहाई आउटलेट गुण है, क्योंकि आप उन्हें सेट एक्सेसर में बनाए रखा जाना चाहिए था:
@interface MyController : MySuperclass {
Control *uiElement;
}
@property (nonatomic, retain) IBOutlet Control *uiElement;
@end
@implementation MyController
@synthesize uiElement;
- (void)dealloc {
[uiElement release];
[super dealloc];
}
@end
इस दृष्टिकोण का लाभ है यह है कि स्मृति प्रबंधन अर्थशास्त्र स्पष्ट और स्पष्ट बनाता है, और यह सभी nib फ़ाइलों के लिए सभी प्लेटफॉर्म पर लगातार काम करता है।
नोट: निम्न टिप्पणियां केवल 3.0 से पहले आईओएस पर लागू होती हैं। 3.0 और बाद के संस्करण के साथ, आपको देखने के बजाय संपत्ति मूल्यों को आसानी से हटा देना चाहिए।
एक विचार यहां है, हालांकि, जब आपका नियंत्रक अपने उपयोगकर्ता इंटरफ़ेस का निपटान कर सकता है और इसे गति पर गतिशील रूप से पुनः लोड कर सकता है (उदाहरण के लिए, यदि आपके पास एक व्यू कंट्रोलर है जो एक निब फ़ाइल से दृश्य लोड करता है, लेकिन अनुरोध पर - मेमोरी प्रेशर के तहत कहें - उम्मीद के साथ इसे फिर से लोड किया जा सकता है यदि दृश्य फिर से जरूरी है)। इस स्थिति में, आप यह सुनिश्चित करना चाहते हैं कि जब मुख्य दृश्य का निपटारा किया जाता है तो आप किसी अन्य आउटलेट के स्वामित्व को भी छोड़ देते हैं ताकि उन्हें भी हटाया जा सके। UIViewController के लिए, आप setView:
अधिभावी इस प्रकार से इस मुद्दे से निपटने के कर सकते हैं:
- (void)setView:(UIView *)newView {
if (newView == nil) {
self.uiElement = nil;
}
[super setView:aView];
}
दुर्भाग्य से यह एक और मुद्दा को जन्म देता है।चूंकि UIViewController वर्तमान में विधि setView:
एक्सेसर विधि (0xका उपयोग करके dealloc
में और स्मृति चेतावनी के जवाब में कहा जाएगा ... dealloc
में एक क्रैश का कारण बन जाएगा।
उपाय सुनिश्चित करने के लिए आउटलेट चर भी dealloc
में nil
की तैयारी में हैं है: सही ढंग से:
- (void)dealloc {
// release outlets and set variables to nil
[anOutlet release], anOutlet = nil;
[super dealloc];
}
यदि हमारे पास एक संपत्ति है, तो हम इसे self.uiElement = nil कहकर सरल बना सकते हैं; उन सभी स्थानों पर जिन्हें हम रिलीज़ करना चाहते हैं, क्योंकि यह एक बरकरार संपत्ति है, इसे वास्तव में इसे ठीक से जारी करना चाहिए और इसे बिना किसी समस्या के सेट करने के लिए सेट करना चाहिए, गुणों को बनाए रखने के फायदों में से एक। –
आप आमतौर पर 'view.uiElement = nil;' 'viewDidUnload' में 'setView:' में नहीं करेंगे। और यह dealloc में 'self.anOutlet = nil;' को कॉल करने के लिए स्पष्ट होगा। –
आपको self.anOutlet = nil को कॉल नहीं करना चाहिए; dealloc में। Dealloc में accessors कॉल करने के लिए यह बुरा अभ्यास है। – tobyc