2012-09-26 4 views
47

शायद यह एक बुरा अभ्यास है, लेकिन मैंने जो दस्तावेज पढ़े हैं, उससे मुझे कुछ मामलों में ऑब्जेक्ट को प्रारंभ करने के लिए सलाह मिल गई है, जो कि दृश्य फ़ाइल के अंदर है और इसे देखने में सक्षम है।आईओएस 6 viewDidUnload अस्वीकृत

उदाहरण के लिए यदि आप एक पर्यवेक्षक को जोड़ने की तरह कुछ पूछना चाहते हैं तो

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(filterready:) 
               name:@"filterReady" 
               object:nil]; 

अब मैं, ऑब्जर्वर दूर करने के लिए एक विधि की जरूरत नहीं है लेकिन viewDidLoad हर बार दृश्य दिखाया गया है जो कई होने में परिणाम है कहा जाता हो जाता है पर्यवेक्षक थोड़ी देर के बाद चल रहे हैं और चयनकर्ता को कई बार बुलाया जाता है।

मैं कुछ क्लीनर को दृश्यडिड डिस्प्लेर विधि में ले जाकर इसे ठीक कर सकता हूं, लेकिन अब मुझे कुछ संदेह है यदि मैं सही काम कर रहा हूं।

मेरी नमूने में मैं भले ही वे संदर्भित नहीं हैं

उत्तर

89

आप - (void)didReceiveMemoryWarning और - (void)dealloc तरीकों का उपयोग करना चाहिए।

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

तो तुम जाँच करनी चाहिए, तो didReceiveMemoryWarning

+0

यह शायद सही जवाब है। फिर भी यह अजीब बात है कि उन्होंने इस संदेश को हटा दिया। मैंने पॉल हेगर्टी की स्लाइड का पालन करके एसडीके का उपयोग करना सीखा, और निश्चित रूप से वे अभी भी आईओएस 5 के लिए हैं। मैं इस साल अपनी अद्यतन स्लाइड की जांच करने जा रहा हूं, शायद वह इस पर एक अच्छा संकेत दे रहा है। – Hons

+2

@ हंस यह बिल्कुल अजीब नहीं है - 'viewDidUnload' स्पष्ट रूप से प्रलेखन के अनुसार था, केवल तभी कहा जाता है जब आपका दृश्य स्मृति चेतावनी के कारण अनलोड हो। यदि आप 'viewDidLoad' के भीतर एक पर्यवेक्षक जोड़ते हैं और इसे केवल' viewDidUnload' में हटाते हैं तो आप इसे हटाए बिना कई बार हटाए जा रहे हैं। इससे अधिसूचना केंद्र में एक लापरवाही सूचक छोड़ दिया जाएगा जो लगभग निश्चित रूप से बाद में दुर्घटनाग्रस्त हो जाएगा। – Tommy

+0

आप कैसे देखते हैं कि आपका दृश्य विंडो में है या नहीं? – zakdances

4

क्यों न सिर्फ dealloc समारोह में पर्यवेक्षक को दूर कई नेविगेशन नियंत्रकों है कि उनके subnavigations को नियंत्रित कर रहे हैं, लेकिन dealloc उनके लिए कहा जाता है कभी नहीं है,? और यदि आप एआरसी का उपयोग कर रहे हैं, तो [सुपर डेलोक]

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

+0

viewDidUnload के पूरे मुद्दे जिन्हें आप दृश्य उतारना और जारी सामान स्मृति को बचाने के लिए है जबकि दृश्य नियंत्रक अभी भी – user102008

+0

iOS 6 में मौजूद कर सकते हैं, UIViewController की viewWillUnload और viewDidUnload तरीकों अब पदावनत कर रहे हैं .... –

+0

इस प्रकार आप shouldn dealloc विधि का उपयोग नहीं करते हैं। क्योंकि वस्तु अभी तक नष्ट होने के लिए तैयार नहीं है। – Craimasjien

9

एलेक्स जवाब में अपने पर्यवेक्षक को दूर अच्छा है। लेकिन मुझे उचित जोड़ी पसंद है। कारण है कि, जब तक कि दृश्य जब यह भी नहीं देखा है अधिसूचित किए जाने की जरूरत है, मैं आम तौर पर अधिसूचना viewWillAppear और viewDidDisappear

+0

viewDidUnload को तब देखा जाता है जब दृश्य अनलोड किया जाता है और दृश्य गायब हो जाने पर ही DDDisappear दिखाई देता है। नोटिफिकेशन जिन्हें देखने के तहत अनियंत्रित किया जाना थाDidUnload विधि, अब, आईओएस 6.0 के बाद से, deReiveiveMemoryWarning या dealloc के साथ अनियंत्रित होना होगा –

12

सबसे पहले, यहाँ तक कि जब viewDidUnload पदावनत नहीं किया गया था, तो आप viewDidUnload में कि अधिसूचना का पंजीकरण रद्द करना पड़ा है चाहिए पर जोड़ने और dealloc। आईओएस 6, viewDidUnload से पहले भी ज्यादातर परिस्थितियों में नहीं कहा जाता है; केवल कम स्मृति स्थितियों में। इसलिए यदि आपने इसे केवल viewDidUnload में रखा है और dealloc नहीं है, तो इसे अनियंत्रित नहीं किया गया होगा, और जब इसे हटा दिया गया था और यह अधिसूचना प्राप्त हो गई तो शायद यह क्रैश हो गई होगी। इसलिए आपको इसे सही ढंग से काम करने के लिए dealloc में रखना होगा।

दूसरा, यदि आपने इसे पहले सही तरीके से किया है, तो आपको आईओएस 6 में सही तरीके से काम करने के लिए कुछ भी करने की आवश्यकता नहीं है। आईओएस 6 में एकमात्र अंतर यह है कि विचार अब अनलोड नहीं किए गए हैं (यहां तक ​​कि कम में भी स्मृति स्थितियों)। तो यह आईओएस 5 जैसा ही है जब आप कम स्मृति स्थिति में नहीं चले गए। चूंकि विचारों को अनलोड नहीं किया गया है, viewDidLoad केवल एक बार कॉल किया जाएगा, इसलिए आपकी अधिसूचना केवल एक बार पंजीकृत होगी।इसे dealloc में अनियंत्रित किया जाएगा, क्योंकि आपने इसे सही तरीके से काम करने के लिए रखा होगा।