जवाबों:
पहले से ही जो संकेत दिया गया है, उसके अलावा, मैं तर्क के बारे में अधिक विस्तार से बताना चाहता था -viewDidUnload
।
इसे लागू करने के लिए सबसे महत्वपूर्ण कारणों में से एक यह है कि UIViewController
उपवर्गों में आमतौर पर दृश्य पदानुक्रम में विभिन्न साक्षात्कारों के मालिक होते हैं। उदाहरण के लिए, इन गुणों को IBOutlets
निब से लोड करते समय या प्रोग्रामेटिक रूप से अंदर रखा जा सकता है -loadView
।
उपखंडों के अतिरिक्त स्वामित्व का UIViewController
मतलब यह है कि जब इसका दृश्य पदानुक्रम से हटा दिया जाता है और स्मृति को बचाने के लिए भी जारी किया जाता है, जिसके माध्यम से उप-अवलोकन भी दृश्य द्वारा जारी किए जाते हैं, तो वे वास्तव में नहीं निपटाए जाएंगे क्योंकि UIViewController
स्वयं के पास अभी भी अपना बकाया है उन वस्तुओं के संदर्भ को भी बनाए रखना। UIViewController
इन वस्तुओं के अतिरिक्त स्वामित्व को जारी करना यह सुनिश्चित करता है कि उन्हें नि: शुल्क मेमोरी से मुक्त किया जाएगा।
आपके द्वारा यहां जारी की जाने वाली वस्तुओं को आमतौर पर फिर से बनाया जाता है और जब UIViewController
दृश्य re-loaded
एक निब से या कार्यान्वयन के माध्यम से फिर से सेट होता है -loadView
।
यह भी ध्यान दें कि UIViewController
view
संपत्ति nil
उस समय तक है जब यह विधि कहलाती है।
जैसा कि प्रलेखन कहता है :
इसे कम-मेमोरी स्थितियों के दौरान कहा जाता है, जब व्यू कंट्रोलर को अपने दृश्य को जारी करने की आवश्यकता होती है और मेमोरी को मुक्त करने के लिए उस दृश्य से जुड़ी कोई भी वस्तु।
उसी स्थिति dealloc
में नहीं कहा जाता है। यह विधि केवल OS3 और इसके बाद के संस्करण में उपलब्ध है। IPhone ओएस 2.x में एक ही स्थिति से निपटना एक वास्तविक दर्द था!
अद्यतन जुलाई 2015 : यह ध्यान दिया जाना चाहिए कि viewDidUnload
आईओएस 6 में पदावनत किया गया था क्योंकि "दृश्य अब कम-मेमोरी स्थितियों के तहत शुद्ध नहीं होते हैं और इसलिए इस पद्धति को कभी नहीं बुलाया जाता है।" तो, आधुनिक सलाह इसके बारे में चिंता करने और उपयोग करने के लिए नहीं है dealloc
।
ऐसा इसलिए है क्योंकि आप आम तौर पर सेट के @property
रूप "(nonatomic, retain)"
में इस तरह के रूप में सेट करते हैं जो आपके लिए बनाया जाता है और वर्तमान ऑब्जेक्ट को जारी करता है और फिर तर्क को बरकरार रखता है अर्थात
self.property = nil;
... की तर्ज पर कुछ करता है:
[property release];
property = [nil retain];
इसलिए आप दो पक्षियों को एक पत्थर से मार रहे हैं: मेमोरी मैनेजमेंट (मौजूदा ऑब्जेक्ट को जारी करना) और पॉइंटर को एनआईएल को सौंपना (क्योंकि एनआईएल पॉइंटर पर कोई भी संदेश भेजने से एनआईएल वापस आ जाएगा)।
उम्मीद है की वो मदद करदे।
याद रखें कि viewDidUnload
दृश्य नियंत्रक में एक विधि है, दृश्य में नहीं। दृश्य की dealloc
विधि जब दृश्य अनलोड कहा जाता हो जाएगा, लेकिन दृश्य नियंत्रक के dealloc
विधि बाद में जब तक नहीं कहा जा सकता है।
यदि आपको कम स्मृति चेतावनी मिलती है और आपका दृश्य प्रदर्शित नहीं हो रहा है, जो कि किसी भी समय के लिए होगा, तो आप UIImagePickerController का उपयोग करते हुए उपयोगकर्ता को चित्र लेने देंगे, आपका दृश्य अनलोड हो जाएगा और इसके बाद पुनः लोड करने की आवश्यकता होगी।
निष्कर्ष:
देखें नियंत्रकों के पास एक दृश्य संपत्ति है। आमतौर पर एक निब या कोड का टुकड़ा इस दृश्य में अन्य विचार जोड़ता है। यह अक्सर इस तरह के -viewDidLoad विधि के अंदर होता है:
- (void)viewDidLoad {
[super viewDidLoad];
[self createManyViewsAndAddThemToSelfDotView];
}
इसके अलावा, एक निब फ़ाइल एक बटन बना सकती है और इसे दृश्य नियंत्रक के दृश्य में जोड़ सकती है।
IPhone OS 2.2 पर, जब -didReceiveMemoryWarning सिस्टम से मंगवाया गया था, तो आपको मेमोरी खाली करने के लिए कुछ जारी करना था। आप पूरे दृश्य नियंत्रक के दृश्य को जारी कर सकते हैं यदि यह समझ में आता है। या इसमें केवल बड़ी मेमोरी-खपत वाली सामग्री।
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
अब, नए ओएस 3.0 में, एक -व्यूडिड्यूऑनलोड विधि है, जिसे सिस्टम से तब प्राप्त किया जाएगा जब कम मेमोरी के कारण दृश्य अनलोड किया गया हो (कृपया मुझे सही करें: जब वास्तव में यह कहा जाता है?)
-viewDidUnload का उपयोग उन सभी ऑब्जेक्ट्स को रिलीज़ करने के लिए किया जाता है जो व्यू कंट्रोलर और व्यू दोनों के स्वामित्व में थे। कारण: यदि कोई व्यू कंट्रोलर चिल्ड्रन्स ऑफ द व्यू यानी एक बटन के संदर्भ में रखता है, तो संदर्भित बच्चे के विचार जारी नहीं किए जाएंगे, क्योंकि उनकी रिटेन काउंट है> = = 1. जब वे इनव्यूडिड्यूऑनलोड जारी किए जाते हैं, तो वे मुक्त हो सकते हैं याद से।
Apple ने दृश्य को हटा दिया गया है अब लोड करें, अब आप अपने objetcs को जारी करने के लिए doReceiveMemoryWarning या Dealloc का उपयोग करते हैं।
IOS 6 में, UIViewController के viewWillUnload और viewDidUnload विधियां अब हटा दी गई हैं। यदि आप डेटा जारी करने के लिए इन विधियों का उपयोग कर रहे थे, तो इसके बजाय didReiveiveMemoryWarning विधि का उपयोग करें। यदि आप उपयोग नहीं किए जा रहे हैं, तो आप इस विधि का उपयोग दृश्य नियंत्रक के दृश्य के संदर्भ को जारी करने के लिए भी कर सकते हैं। आपको यह परीक्षण करने की आवश्यकता होगी कि ऐसा करने से पहले दृश्य एक विंडो में नहीं है।
यदि व्यू कंट्रोलर को नैविगेशन कंट्रोलर स्टैक से पॉपअप किया जाता है और उसे कहीं और नहीं रखा जाता है, तो इसे डीललोक किया जाएगा, और व्यूडाउन के बजाय डीललॉक को कॉल किया जाएगा। आपको डीलवॉक में loadView में बनाए गए विचारों को जारी करना चाहिए, लेकिन वेरिएबल्स को शून्य पर सेट करना आवश्यक नहीं है, क्योंकि जल्द ही डीललोक कहा जाता है, वेरिएबल अब मौजूद नहीं होगा।