2009-02-23 7 views
24

मैं विचारों के बीच स्थानांतरित करने के लिए UINavigationController का उपयोग कर रहा हूं। जब मैं विचारों में आगे और आगे बढ़ता हूं, तो मेरे ऐप द्वारा उपयोग की जाने वाली मेमोरी बढ़ती जा रही है। सभी व्यू कंट्रोलर के डेलोक विधि में एनएसएलओजी स्टेटमेंट्स रखने पर, मैंने देखा कि इसे केवल कुछ व्यू कंट्रोलर के लिए बुलाया जा रहा था और जो भी पॉप किए गए थे।आईफोन - एक व्यू कंट्रोलर के लिए डेलोक कब होता है?

उदाहरण के लिए, इस क्रम में जो विचारों पुश किए जाते हैं MainViewController -> viewcontroller1 -> viewcontroller2 -> viewcontroller3

अब viewcontroller3 अगर मैं एक popToViewController कर में: mainController, dealloc केवल viewcontroller3 के लिए कहा जाता है। इसे viewcontroller1 और 2.

क्या कोई मुझे बता सकता है कि यह क्यों हो रहा है।

समस्या मिली। व्यू कंट्रोलर द्वारा आयोजित संदर्भों में से कोई भी स्मृति में अभी भी डेलोक विधि को नहीं बुलाया जा रहा था। मेरे मामले में यह MPMoviePlayerController ऑब्जेक्ट था जिसे viewcontroller1 और viewcontroller2 में जारी नहीं किया गया था।

+0

मुझे बिल्कुल एक ही समस्या का सामना करना पड़ा; dealloc केवल तीसरे नियंत्रक के लिए बुलाया जाता है। आपने कहा "यदि व्यू कंट्रोलर द्वारा आयोजित किसी भी संदर्भ में स्मृति में अभी भी कोई डेलोक विधि नहीं कहा जा रहा था।" क्या आप इसे विस्तार से बताएंगे? –

+1

व्यू कंट्रोलर अभी भी इस्तेमाल होने वाली किसी ऑब्जेक्ट का प्रतिनिधि था। मैंने इसे प्रतिनिधि होने से हटा दिया और फिर यह ठीक काम किया। अन्य ऑब्जेक्ट को इसके संदर्भ (प्रतिनिधि के रूप में) – lostInTransit

उत्तर

13

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

यदि आप बर्गर पर वापस जाते हैं तो आप शीर्ष बुन लेते हैं (पॉपव्यू कंट्रोलर: पॉप किए गए दृश्य की डेलोक विधि को कॉल करता है)। यदि आप नीचे बुन पर वापस जाना चाहते हैं तो आपको बर्गर को पॉप करना होगा (जब भी दृश्य पॉप हो जाता है तो डेलोक को बुलाया जाता है)।

नहीं

यकीन है कि क्यों पॉप दूसरे दृश्य नियंत्रक के dealloc रूट करने के लिए पर हालांकि कहा जा नहीं होता ..

हम्म

+0

धन्यवाद दान के बाद से हटा दिया नहीं जा रहा था। यह है कि मुझे आश्चर्य की बात है कि कुछ वर्गों के लिए डेलोक को बुलाया जाता है, न कि दूसरों के लिए। क्या आप किसी भी परिस्थिति से अवगत हो सकते हैं जब यह हो सकता है? – lostInTransit

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है, मेरे पास दो व्यू कंट्रोलर भी हैं और नेविगेशन स्टैक से पॉप होने पर दूसरा व्यू कंट्रोलर का डेलोक कॉल नहीं किया जा रहा है। – Heena

0

जहाँ आप अपने नियंत्रकों नेवीगेट करने pushviewcontroller के बाद इस लाइन लिखने की ज़रूरत किया जाना चाहिए, [देखें नियंत्रण नाम रिलीज]; तो यह प्रत्येक व्यू कंट्रोलर डेलोक विधि को कॉल करेगा :)

+0

यह नए ओबीजेसी देवताओं के लिए 'याद रखने के लिए' बिंदु से अधिक पूछे गए प्रश्न का वास्तविक उत्तर नहीं है। – Sushant

0

आपको यह भी ध्यान में रखना चाहिए कि डेलोक हमेशा चलाने की गारंटी नहीं देता है।

+1

यह गलत है। जब किसी ऑब्जेक्ट का अंतिम संदर्भ जारी किया गया है तो Dealloc चलाएगा। – Jason

+6

अच्छी तरह से गलत नहीं है, यह सच है अगर एप्लिकेशन कोको के लिए मेमोरी प्रबंधन प्रोग्रामिंग गाइड के अनुसार बाहर निकल रहा है। –

-1

[self.navigationController popToRootViewControllerAnimated: YES] जैसे उपयोग करें; यह मेरे लिए काम करता है ... मेरे 10 व्यू कंट्रोलर के सभी डेलोक मेथोस को कॉल करता है

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