2010-07-06 11 views
7

मैं थोड़ा उलझन में हूं कि वास्तव में निब-आधारित UIViewController एस में क्या होता है।UIViewController के दृश्य में IBOutlets जारी करनाDidUnload?

// Release any retained subviews of the main view. 
// e.g. self.myOutlet = nil; 

जो subviews करने के लिए इस पर लागू होता है: जब एक UIViewController उपवर्ग पैदा करने, टेम्पलेट viewDidUnload विधि में एक बहुत ही विशेष टिप्पणी में शामिल है?

  • जिन लोगों को मैंने viewDidLoad में प्रारंभ किया था? (मैं हाँ कहूंगा)
  • जिन्हें मैंने initWithNibName में शुरू किया था? (मैं नहीं कहूंगा)
  • आईबीओटलेट जो निब में वस्तुओं का संदर्भ देता है?

अगर मैं इस तरह दृश्य नियंत्रक का उपयोग करें:

MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[self.navigationController pushViewController:controller animated:YES]; 
[controller release]; 

इस मामले में मुझे लगता है कि यदि ऐसा नहीं होता है कि क्या ज्यादा बात उदाहरण चर subview के लिए संदर्भ पकड़ dealloc के बाद से viewDidUnload या dealloc में जारी कर रहे हैं चाहिए जैसे ही व्यू कंट्रोलर स्टैक से पॉप आउट हो जाता है, इसलिए मुझे कॉल किया जा सकता है, इसलिए मैं ऐप्पल के रूप में भी ऐसा कर सकता हूं और dealloc के बजाय viewDidUnload पर इंस्टेंस चर जारी करता हूं।

if(self.myViewController == nil) { 
    self.myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
} 
//Change some state which should be reflected in the view 
self.myViewController.someProperty = someValue; 
[self.navigationController pushViewController:self.myViewController animated:YES]; 

क्या MyViewController में क्या होता है अगर मैं viewDidUnload में एक IBOutlet जारी:

लेकिन मैं एक उदाहरण चर कि कई बार धक्का दिया जा सकता है के रूप में इस्तेमाल किया MyViewController लगता है? क्या मैं अगले viewDidLoad पर इसका नया संदर्भ रखने पर भरोसा कर सकता हूं?

दूसरे शब्दों में: viewDidUnload के बाद दृश्य के साथ क्या होता है? अगर इसे फिर से धक्का दिया जाता है तो क्या इसे निब से रिहा किया जाता है और फिर से लोड किया जाता है? या दृश्य स्मृति में रहता है? और यदि हां, तो आउटलेट viewDidLoad से पहले पुनः सेट करें?

किसी भी दृश्य स्मृति में रहता है और दुकानों viewDidLoad पहले उसे फिर से स्थापित कर रहे हैं या हर बार नियंत्रक धकेल दिया जाता है पुनः लोड है, तो मुझे लगता है कि यह (viewDidUnload में दुकानों को रिहा करने का सही होगा भी पहले मामले में हालांकि यह कोई फरक नहीं पडता)। लेकिन अन्यथा (विशेष रूप से दृश्य स्मृति में रहता है और दुकानों पर पुन: स्थापित कर रहे हैं तो), viewDidUnload में subviews रिहा उपयोग के मामले मैं प्रस्तुत करने के लिए गलत है, मैं सही हूँ?

+0

अद्यतन: ध्यान दें कि 'viewDidUnload' को आईओएस 6 के लिए बहिष्कृत किया जाएगा क्योंकि जाहिर है, यह बहुत से डेवलपर्स (केवल मुझे नहीं) में भ्रमित कर रहा था और वे अक्सर इसे गलत तरीके से उपयोग कर रहे थे, जो कारण होगा जब उनकी डेवलपर्स के लिए खाता नहीं था, तो स्मृति ऐप को तब तक दुर्घटनाग्रस्त/दुर्व्यवहार करने के लिए ... –

उत्तर

7

UIViewController documentation, मेमोरी मैनेजमेंट अनुभाग से:

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

तो न केवल आप viewDidUnload में अपने आउटलेट जारी कर सकते हैं, यह पसंदीदा और अनुशंसित तरीका है।

और हां, आप viewDidLoad कहलाते समय अपने आउटलेट मान्य वस्तुओं को इंगित करने पर भरोसा कर सकते हैं। UIViewController प्रलेखन से, viewDidLoad पर:

दृश्य विधि नियंत्रक ने अपने संबंधित दृश्यों को स्मृति में लोड करने के बाद कहा जाता है।

+0

बस यह सुनिश्चित करने के लिए: यदि कोई दृश्य में अतिरिक्त दृश्य जोड़ता है, तो इसे देखने के लिए आवश्यक है, इसे देखने और उन्हें देखने के लिए आवश्यक है DidUnload :, क्योंकि यह हो सकता है अच्छी तरह से देखेंDidLoad: बाद में दूसरी बार कॉल किया जाएगा और मुझे अतिरिक्त सबव्यूज़ की कई प्रतियों के साथ छोड़ा जाएगा? – Eiko

+1

सबसे पहले, आपको वास्तव में गुणों के माध्यम से अपने सभी मेमोरी प्रबंधन करना चाहिए, और सीधे इवर तक नहीं पहुंचना चाहिए। अपने प्रश्न का उत्तर देने के लिए, भले ही आप गुणों का उपयोग करते हैं और डेलोक में रिलीज़ करते हैं (और इसलिए मेमोरी रिसाव का कारण नहीं बनते हैं), फिर भी उन्हें देखने में कोई बात नहीं है क्योंकि उन्हें डीडलोड में रीडायरेक्ट किया जाएगा। –

+0

आपके मार्गदर्शन के बाद, मुझे सभी बनाए रखी वस्तुओं को गुण बनाना चाहिए, और इस प्रकार निजी चर की अवधारणा को खोना चाहिए, सही? –