दिलचस्प पोस्ट
एक पायथन स्ट्रिंग में यू उपसर्ग क्या है? जावास्क्रिप्ट: वेरिएबल से पहले प्रतीक मैं अपने कोड को अधिक सुरक्षित बनाने के लिए पीडीओ के साथ पासवर्ड हैशिंग का उपयोग कैसे करूं? रेगएक्स को उद्धरण चिह्नों के बाहर कोमा चुनने के लिए इकाई फ़्रेमवर्क: इस कमान से पहले से एक खुले डेटारिडर जुड़ा हुआ है डी 3 में "क्लिक करें" ईवेंट प्रोग्राम को कैसे खोलें? संपत्ति द्वारा कोणीय जे एस छँटाई वीबी.नेट में क्लासेस बनाम मॉड्यूल क्या तुच्छ कुंजी के मामले में अनारडेड_मैप पर मानचित्र का उपयोग करने का कोई फायदा है? दोहराएँ स्ट्रिंग – जावास्क्रिप्ट एस्प एमवीसी में डेटाबेस से चित्र प्रदर्शित करें बहु-लाइन खोज के लिए रेगेक्स (जीआरपी) की आवश्यकता जावा में एक अंश का प्रतिनिधित्व करने का सबसे अच्छा तरीका है? सीएमडी के साथ फ़ाइल पथ से फ़ोल्डर पथ कैसे प्राप्त करें फ़ायरफ़ॉक्स या क्रोम में ActiveXObject (IE नहीं!)

कब में वस्तुओं को छोड़ना चाहिए – (शून्य) viewDidUnload में -dealloc के बजाय?

क्या है -(void)viewDidUnload लिए अच्छा है?

क्या मैं सिर्फ सब कुछ नहीं -dealloc ? यदि दृश्य ने अनलोड किया है, तो क्या नहीं होगा -dealloc को वैसे भी बुलाया जाएगा?

वेब के समाधान से एकत्रित समाधान "कब में वस्तुओं को छोड़ना चाहिए – (शून्य) viewDidUnload में -dealloc के बजाय?"

पहले से ही संकेत दिया गया है कि इसके अतिरिक्त, मैं तर्क के बारे में और अधिक विस्तार करना चाहता -viewDidUnload

इसे लागू करने के लिए सबसे महत्वपूर्ण कारणों में से एक यह है कि UIViewController subclasses में आमतौर पर दृश्य पदानुक्रम में विभिन्न उप-दृश्यों के मालिकाना संदर्भ होते हैं। इन गुणों को -loadView जरिए सेट किया जा सकता था जब एक निब से लोड होता था, या प्रोग्रामेटिक इन-लोड -loadView , उदाहरण के लिए,

UIViewController द्वारा उप-दृश्यों का अतिरिक्त स्वामित्व का मतलब है कि जब भी इसका दृश्य दृश्य पदानुक्रम से हटा दिया जाता है और स्मृति को सहेजने के लिए जारी किया जाता है, जिसके माध्यम से उपदृश्य भी दृश्य द्वारा रिलीज़ किए जाते हैं, वे वास्तव में वितरित नहीं किए जाएंगे क्योंकि UIViewController स्वयं अभी भी इसमें शामिल है स्वयं के रूप में अच्छी तरह से उन वस्तुओं के बकाया बनाए रखने के संदर्भ। इन वस्तुओं के UIViewController अतिरिक्त स्वामित्व को रिहा करने से यह सुनिश्चित होता है कि वे नि: शुल्क मेमोरी के लिए भी डेलोकेटेड होंगे।

जब आप UIViewController दृश्य को re-loaded , तो या तो Nib से या -loadView कार्यान्वयन के माध्यम से आप जिस वस्तु को यहां रिलीज करते हैं, वह आमतौर पर पुनः निर्मित और सेट -loadView

यह भी ध्यान रखें कि UIViewController view संपत्ति इस विधि को समय से nil है।

दस्तावेज़ीकरण कहता है :

इसे कम स्मृति स्थितियों के दौरान कहा जाता है, जब दृश्य नियंत्रक को इसके दृश्य और स्मृति को मुक्त करने के लिए उस दृश्य से संबंधित किसी वस्तु को छोड़ने की आवश्यकता होती है।

उसी स्थिति में dealloc नहीं कहा जाता है यह विधि केवल OS3 और इसके बाद के संस्करण में उपलब्ध है आईफोन ओएस 2.x में एक ही स्थिति से निपटना एक असली दर्द था!

जुलाई 2015 को अपडेट करें : यह ध्यान दिया जाना चाहिए कि viewDidUnload को IOS 6 में पदावनत किया गया था क्योंकि "दृश्य अब कम-स्मृति स्थितियों के तहत शुद्ध नहीं हैं और इसलिए यह विधि कभी नहीं बुलाती है।" इसलिए, आधुनिक सलाह इसके बारे में चिंता करने और dealloc का dealloc

इसका कारण यह है कि आप आमतौर पर @property को "(nonatomic, retain)" रूप में सेट कर देंगे और जैसा कि आपके लिए बनाया गया सेटर को वर्तमान ऑब्जेक्ट रिलीज़ किया जाता है और फिर तर्क को रोकता है I

 self.property = nil; 

… की तर्ज पर कुछ करता है:

 [property release]; property = [nil retain]; 

इसलिए आप दो पक्षियों को एक पत्थर से मार रहे हैं: स्मृति प्रबंधन (मौजूदा ऑब्जेक्ट को रिलीज़ करना) और पॉइंटर को नीला के लिए असाइन करना (कोई निइल पॉइंटर को कोई संदेश भेजने के बाद शून्य लौट आएगा)।

उम्मीद है की वो मदद करदे।

याद रखें कि viewDidUnload दृश्य नियंत्रक में एक विधि है, न कि दृश्य में। दृश्य की dealloc विधि को तब बुलाया जाएगा जब दृश्य अनलोड हो जाता है, लेकिन दृश्य नियंत्रक की dealloc विधि को तब तक नहीं बुलाया जा सकता है जब तक

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

निष्कर्ष:

नियंत्रकों को देखने के लिए एक दृश्य संपत्ति है। आमतौर पर एक निब या कोड का टुकड़ा इस दृश्य को अन्य दृश्यों में जोड़ता है। ऐसा आमतौर पर एक -viewDidLoad विधि के अंदर होता है, जैसे:

 - (void)viewDidLoad { [super viewDidLoad]; [self createManyViewsAndAddThemToSelfDotView]; } 

इसके अतिरिक्त, एक निब फाइल एक बटन बना सकती है और इसे दृश्य नियंत्रक के दृश्य में जोड़ सकती है।

आईफोन ओएस 2.2 पर, जब सिस्टम से लेकर डीडीआरईसीइममाइरी वार्निंग की व्यवस्था की गई थी, आपको स्मृति को खाली करने के लिए कुछ रिलीज करना पड़ा था। यदि आप समझ गए तो आप पूरे दृश्य नियंत्रक के दृश्य को जारी कर सकते हैं। या इसमें सिर्फ बड़ी मेमोरी वाली सामग्री है

 - (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. इन -viewDidUnload में जारी होने के बाद, वे मुक्त हो सकते हैं याद से।

ऐप्पल अपवर्तित दृश्यविजलउलोड, अब आप का उपयोग करने के लिए shoureiveMemoryWarning या dealloc अपने objetcs जारी करने के लिए shoud

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

यदि दृश्य नियंत्रक को नेविगेशन नियंत्रक स्टैक से पॉप किया गया है और कहीं और नहीं रखी गई है, तो यह deallocated होगा, और dealloc के बजाय viewDidUnload बुलाया जाएगा आपको डेलोक में लोड वीव में बनाए गए दृश्य को रिलीज़ करना चाहिए, लेकिन वेरिएबल को शून्य में सेट करने के लिए आवश्यक नहीं है, क्योंकि डेलोक के बाद ही कहा जाता है कि वे चर अब मौजूद नहीं होंगे।

आप किसी भी सबव्यूज को जारी कर सकते हैं, उदाहरण के लिए, आपने UIImageView को अपनी लोड-वीव विधि में बनाए रखा है, या बेहतर छवि अभी तक उस UIImageView पर थी।