2012-06-29 13 views
63

के बीच अंतर viewDidLoad और viewDidAppear के बीच क्या अंतर है? उन कार्यों में किस तरह का प्रारंभिक या कस्टम कोड जाता है?viewDidLoad और viewDidAppear

उदा। presentModalViewController केवल तभी काम करता है जब viewDidAppear में मौजूद है और viewDidLoad पर नहीं है।

+0

सी [UIViewController। viewDidLoad बनाम देखें WillAppear: श्रम का उचित विभाजन क्या है?] (http://stackoverflow.com/questions/1579550/uiviewcontroller-viewdidload-vs-viewwillappear-what-is-the-proper-division-of) –

उत्तर

118

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

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

देखें: https://developer.apple.com/documentation/uikit/uiviewcontroller

+11

आप और राइट्ससीएस बिल्कुल सही हैं। लेकिन, बाल विभाजित नहीं करने के लिए, लेकिन 'viewDidLoad' को आम तौर पर केवल एक बार और केवल एक बार बुलाया जाता है, एक ऐसी स्थिति होती है जहां इसे फिर से बुलाया जा सकता है। विशेष रूप से, यदि आपको कभी भी 'didReceiveMemoryWarning' प्राप्त होता है, तो आपके गैर-दृश्यमान दृश्य जारी किए जा सकते हैं (हालांकि दृश्य नियंत्रक छेड़छाड़ किए जाते हैं) और जब आप वापस लौटते हैं, तो उनके लिए' viewDidLoad' फिर से बुलाया जा सकता है। – Rob

+0

यह सच है, लेकिन उस स्थिति में, किसी भी बनाए रखा इवर जारी किए जाएंगे, इसलिए उन्हें पुन: प्रारंभ करना सुरक्षित है ... लेकिन यदि आप दृश्य में एक ivar बनाए रखते हैं तो डिडएपियर और इसे देखने में रिलीज़ न करें DidDisappear, आपको स्मृति प्राप्त होने की संभावना है रिसाव यदि आप वर्तमान दृश्य के शीर्ष पर अन्य दृश्य नियंत्रकों को दबा रहे हैं। – davidgoli

+1

मुझे यकीन नहीं है कि मैं हमेशा देखने के लिए नियंत्रक ivars के बारे में टिप्पणी से सहमत हूं और स्वचालित रूप से आपके लिए जारी किया जा रहा है (नियंत्रक स्वयं _not_ जारी है)। मुझे संदेह है कि हम दोनों आसानी से एक व्यूडिडलोड बना सकते हैं जो 'रीडसीव मेमरीवार्निंग' के बाद फिर से लागू होने पर रिसाव कर देगा। लेकिन मैं मानता हूं कि यदि आप अपना 'व्यूडिडलोड' लिखते समय अच्छे अभ्यास करते हैं, तो आपको ठीक होना चाहिए। मेरा एकमात्र बिंदु यह है कि इवर और मैन्युअल मेमोरी प्रबंधन का मैला उपयोग निश्चित रूप से 'viewDidLoad' में लीक में हो सकता है। लोगों को तदनुसार 'didReceiveMemoryWarning' परिदृश्य और कार्यक्रम के प्रति संवेदनशील होना चाहिए। – Rob

18

सीधे शब्दों में कहें, आप viewDidLoad में कोई भी नियंत्रण या सरणी बनाना चाहते हैं, जहां viewDidAppear में है जहां आप उन नियंत्रणों या सरणी को रीफ्रेश करना चाहते हैं।

viewDidLoad एक बार कहा जाता है जब नियंत्रक बनाया गया है और viewDidAppear हर बार देखने के लिए, अच्छी तरह से, DID दिखाई कहा जाता है। तो कहें कि आपके पास एक मॉडल दृश्य है जो आप प्रस्तुत करते हैं, जब उस दृश्य को खारिज कर दिया जाता है, viewDidAppear कहा जाएगा, और viewDidLoad नहीं कहा जाएगा।

+3

पहला अनुच्छेद एक अच्छी तरह से रखा टिप है। लेकिन दूसरा अनुच्छेद गलत है। 'viewDidLoad' * को एक से अधिक * कहा जा सकता है। यदि आपका दृश्य प्रदर्शित नहीं होता है (अन्य दृश्यों के ढेर के नीचे) कम स्मृति स्थिति में आईओएस के पुराने संस्करणों द्वारा अनलोड किया जाता है, तो दृश्य नियंत्रक स्वचालित रूप से स्क्रीन पर फिर से प्रदर्शित होने की आवश्यकता पर दृश्य को फिर से लोड कर देगा। आईओएस के बाद के संस्करणों में आप पहले आईओएस के लिए किए गए मेमोरी उपयोग को कम करने में मदद करना चुन सकते हैं: 'रीडसीव मेमरी चेतावनी' संदेश आने पर ऑफस्क्रीन दृश्यों को अनलोड करें, इस स्थिति में 'viewDidLoad' फिर से कॉल किया जाएगा। –

+0

@WrightsCS क्या आपके पास कोई आधिकारिक सेब दस्तावेज़ है जो कहता है? "viewDidLoad को एक बार कॉल किया जाता है जब नियंत्रक बनाया जाता है" क्योंकि मुझे पिछले दृश्य में याद है डिडलोड को कम स्मृति परिदृश्यों के तहत कई बार बुलाया जा सकता है। बहुत बहुत धन्यवाद। – Ricardo

+0

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/viewDidLoad – WrightsCS

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