2010-02-14 23 views
20

मैं -dealloc में मेरा सामान जारी करने के लिए जाते हैं, और अब iPhone OS 3.0 यह हास्यास्पद -viewDidUnload विधि, वे कहाँ का कहना है कि शुरू की:मुझे देखने में क्या करना चाहिए DidUnload?

// रिलीज किसी भी मुख्य दृश्य के subviews बनाए रखा। // उदा। self.myOutlet = शून्य;

तो -viewDidUnload को कॉल करने के लिए कहा जाता है जब दृश्य नियंत्रक के दृश्य को स्मृति से निकाल दिया गया है। और यदि मेरे पास व्यू कंट्रोलर के मुख्य दृश्य से जुड़ा हुआ सबव्यूव्यू है, तो मुझे केवल उस सामान को रिलीज़ करना होगा, लेकिन डिलीक में भी नहीं?

यह भ्रमित है। इसके अलावा, क्या होगा यदि -dealloc दृश्य को अनलोड (रिलीज़) का कारण बनता है? फिर फिर, यह कॉल -viewDidUnload कॉल करेगा?

मुझे अंतर का एहसास है, कि -viewDidUnload केवल उस मामले के लिए है जहां दृश्य स्वयं ही मारा जाता है, लेकिन दृश्य नियंत्रक स्मृति में रहता है। और -डालोक उस मामले के लिए है जहां पूरी चीज कचरा हो जाती है।

शायद कोई भ्रम को दूर कर सकता है।

+1

इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/1158788/when-should-i-release-objects-in-voidviewdidunload-rather-than-in-dealloc –

+0

viewDidUnload आईओएस 6 में बहिष्कृत है! – whyoz

उत्तर

37

यहां अपना इरादा आपके सबव्यू प्रबंधन को "संतुलित" करना है। viewDidLoad में जो कुछ भी आप बनाते हैं उसे viewDidUnload में रिलीज़ किया जाना चाहिए। यह ट्रैक रखना आसान बनाता है कि कहां जारी किया जाना चाहिए। ज्यादातर मामलों में, आपकी dealloc विधि आपकी init विधि की दर्पण-छवि है, और आपके viewDidUnload आपकी viewDidLoad विधि की दर्पण छवि होगी।

जैसा कि आपने बताया, viewDid ... जब दृश्य स्वयं लोड और अनलोड किया जाता है तो विधियों का उपयोग किया जाना चाहिए। यह एक उपयोग पैटर्न, जिसमें दृश्य नियंत्रक स्मृति में लोड रहता है परमिट, लेकिन दृश्य ही भरी हुई और के रूप में आवश्यक उतार दिया जा सकता है:

init 
viewDidLoad 
viewDidUnload 
viewDidLoad 
viewDidUnload 
... 
dealloc 
बेशक

, यह चोट नहीं करता है के रूप में अपने dealloc विधि में चीजों को रिलीज करने के लिए ठीक है, जब तक आप उन्हें nil पर सेट करते हैं जब आप उन्हें viewDidUnload में रिलीज़ करते हैं।

एप्पल के UIViewController documentation की मेमोरी मैनेजमेंट अनुभाग से निम्न बोली, और अधिक विस्तार में यह वर्णन करता है:

... iPhone OS 3.0 में और बाद में, viewDidUnload विधि सबसे जरूरतों के लिए एक अधिक उपयुक्त जगह हो सकती है ।

जब कम-स्मृति चेतावनी होती है, तो UIViewController क्लास अपने विचारों को शुद्ध करता है अगर यह जानता है कि यह बाद में फिर से लोड या फिर से बना सकता है। यदि ऐसा होता है, तो यह आपके कोड को आपके दृश्य पदानुक्रम से जुड़े किसी भी ऑब्जेक्ट के स्वामित्व को छोड़ने का मौका देने के लिए viewDidUnload विधि को भी कॉल करता है, जिसमें nib फ़ाइल से लोड की गई ऑब्जेक्ट्स, आपके दृश्य में बनाई गई ऑब्जेक्ट्सडिडलोड विधि और ऑब्जेक्ट्स आलसी रूप से बनाई गई हैं रनटाइम और दृश्य पदानुक्रम में जोड़ा गया। आम तौर पर, यदि आपके व्यू कंट्रोलर में आउटलेट्स (गुण या कच्चे चर शामिल हैं जिनमें आईबीओलेट कीवर्ड शामिल है), तो आपको उन आउटलेट्स या किसी अन्य व्यू-संबंधित डेटा के स्वामित्व को छोड़ने के लिए viewDidUnload विधि का उपयोग करना चाहिए, जिसकी आपको अब आवश्यकता नहीं है।

+0

viewDidUnload दृश्य के दर्पण नहीं है DidLoad के बाद से अनलोड विधि आउटलेट सेट करने के लिए सेट करता है। –

+1

आप किस अनलोड विधि का जिक्र कर रहे हैं? मैंने UIViewController दस्तावेज़ों के माध्यम से एक झलक लिया, लेकिन मुझे उस नाम के साथ कोई विधि नहीं मिली। जब मैंने viewDidUnload को (आमतौर पर) दृश्य दर्पण छवि के दर्पण छवि के रूप में वर्णित किया, तो मेरा मतलब स्मृति प्रबंधन के संदर्भ में था; i.e .: दृश्य में आवंटित, प्रतिलिपि या बनाए रखा गया कुछ भी देखें DidLoad viewDidUnload में जारी किया जाना चाहिए। आईबीऑटलेट आमतौर पर स्वचालित रूप से कॉन्फ़िगर किया जाता है जब आपकी निब फ़ाइल लोड हो जाती है, इसलिए यदि वे कॉल से पहले शून्य से सेट हो जाते हैं तो देखने के लिए, जो स्मृति बिंदु से कुछ भी प्रभावित नहीं करना चाहिए। –

+0

स्पष्ट होना; मैं देख सकता हूं कि यदि आप किसी ऑब्जेक्ट को ऑब्जेक्ट आवंटित करना चाहते हैं तो परेशानी में भाग लेने के लिए यह संभव होगा * डीडलोड जो दृश्य में पहुंच योग्य नहीं होगा, जब सभी आईबीओलेट्स को शून्य पर सेट किया गया था। यह खराब डिजाइन का एक मजबूत संकेत होगा, हालांकि, किसी ऑब्जेक्ट को हमेशा किसी भी स्मृति में पॉइंटर बनाए रखना चाहिए जो इसे जारी करने के लिए ज़िम्मेदार है। –

3

जैसा कि आप कहते हैं कि viewDidUnload को स्वयं कहा जाएगा अगर self.view = nil, यह आमतौर पर तब होता है जब आपको स्मृति चेतावनी मिलती है। इस विधि में आपको मुख्यदृश्य के किसी भी सबव्यू को रिलीज़ करना होगा जिसे आसानी से .xib या loadView विधि द्वारा बनाया जा सकता है।यदि आप उन्हें व्यूलोड या लोड व्यू इत्यादि में देखते हैं तो आपको किसी भी डेटा ऑब्जेक्ट को रिलीज़ करना चाहिए क्योंकि उपयोगकर्ता को देखने के लिए इन विधियों को फिर से कॉल किया जाएगा, उन डेटा को आसानी से बनाया जा सकता है।

0

जब आपको स्मृति चेतावनी मिलती है तो आमतौर पर व्यू कंट्रोलर इसके दृश्य को उतार देगा लेकिन स्वयं ही डेलोक नहीं होगा।
जो भी आसानी से फिर से बनाया जा सकता है उसे अनलोड किया जाना चाहिए, लेकिन दृश्य का मॉडल नहीं होना चाहिए।

संबंधित मुद्दे