ViewDidLoad और viewDidAppear के बीच अंतर


86

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

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


जवाबों:


147

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

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

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


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

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

2
इस बिंदु पर विश्वास करने के लिए नहीं, लेकिन इस आदान-प्रदान के 24 घंटे से भी कम समय के बाद, एक अन्य प्रश्न का उत्तर देते हुए , मैंने ठीक उसी तरह का एक उदाहरण पाया, viewDidLoadजिस पर कोड का रिसाव होगा didReceiveMemoryWarning। आह।
रोब

1
यह उत्तर सीधे तौर पर इस एक दूसरे का खंडन करता है: stackoverflow.com/a/3411636/269753 मैं अपने व्यूडीडलॉड विधि को केवल एक बार से अधिक कहे जाने का अवलोकन कर रहा हूं, यहां तक ​​कि स्मृति चेतावनी प्राप्त नहीं करने पर भी। कोई भी स्पष्ट करना चाहता है?
रिकार्डो सांचेज-सेज़

2
मुझे नहीं लगता कि इसमें कोई विरोधाभास है। यह सवाल viewDidLoad और viewDidUnload के बीच संबंध के बारे में है, न कि viewDidAppear के बारे में।
दाविदगोली

21

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

viewDidLoadजब एक बार कंट्रोलर बनाया viewDidAppearजाता है और उसे हर बार व्यू, वेल, डीआईडी ​​दिखाई देता है। तो कहते हैं कि आपके पास एक आदर्श दृष्टिकोण है जो आप पेश करते हैं, जब वह दृश्य खारिज हो जाता है,viewDidAppear जाता है, तो उसे कॉल किया जाएगा, और viewDidLoadउसे कॉल नहीं किया जाएगा।


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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.