2009-05-09 10 views
59

मुझे आपके कार्यान्वयन से पहले और आपके कार्यान्वयन के बाद बुलाया गया [सुपर व्यूडिडलोड] के साथ कुछ उदाहरण कोड दिखाई देता है।`[सुपर व्यूडिडलोड] 'सम्मेलन

मुझे पता है कि आपको हमेशा सुपर कॉल नहीं करना पड़ता है (जैसा कि कई अन्य चर्चाओं में देखा गया है)। जब आप इसे कॉल करते हैं, तो क्या यह कोड से पहले या बाद में अपेक्षित है?

यह सुपर के कार्यान्वयन के आधार पर परिणाम हो सकता है। हालांकि आपको अपना लिखने के लिए सुपर के कार्यान्वयन को नहीं जानना चाहिए।

बेशक

इस UIViewControllers प्रतिनिधि तरीकों के सभी के लिए चला जाता है (willAppear, didAppear, आदि ...)

किसी भी विचार?

+0

संबंधित: http://stackoverflow.com/questions/824695/do-i-always-have-to-call-super-viewdidload-in-the-viewdidload-method – cregox

उत्तर

91

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

+7

जेसन से अक्सर सलाह, और अक्सर ऐप्पल दस्तावेज़ subclasser जिम्मेदारी जब यह महत्वपूर्ण है। जैसे जब कुछ महत्वपूर्ण व्यवहार सुपर कॉल पर निर्भर करता है, तो इसे अक्सर दस्तावेज़ में हाइलाइट किया जाता है। सामान्य रूप से, यदि यह आपको चोट पहुंचाने वाला नहीं है, तो बस सुरक्षित होने के लिए सुपर से कॉल करें। – danielpunkass

+0

धन्यवाद, यह बहुत तार्किक और तरह का दृष्टिकोण है जिसे मैं ले रहा था। मैं अपनी कक्षाओं को उप-वर्गीकृत कर रहा था और मेरे पास एक विकल्प था कि क्या करना है। मैंडिडलोड के पहले/बाद में सेटअप की आवश्यकता के द्वारा सम्मेलन का उल्लंघन नहीं करना चाहता था। –

+3

बेशक इसके विपरीत -dealloc में, क्योंकि आपको इसे हटाए जाने से पहले सुपरक्लास से संबंधित किसी चीज़ का उपयोग करने की आवश्यकता हो सकती है। – mk12

0

मान लें कि आपके पास 2 कक्षा, एक अभिभावक और एक बच्चा है। बच्चे माता-पिता से विरासत में आता है। उनके पास नमस्कार नामक एक विधि है जो एक स्ट्रिंग देता है।

यहाँ माता पिता विधि कैसा दिखता है:

कोड:

-(NSString *)greet { 
return @"Hello"; 
} 

हम बच्चे को अपने माता-पिता से सीखना चाहते हैं। तो हम नमस्कार कहने के लिए सुपर का उपयोग करते हैं कि मॉमी कैसे नमस्कार करेगी, लेकिन हमारे अपने छोटे जोड़े भी।

कोड: // जनक

-(NSString *)greet { 
NSString *parentGreeting = [super greet]; 
return [parentGreeting stringByAppendingString:@", Mommy"] 
} 

से तो अब जनक विरासत में मिली बधाई दी "नमस्ते", एवं बाल बधाई दी "नमस्ते, माँ"। बाद में, अगर हम सिर्फ "हाय" लौटने के लिए माता-पिता की बधाई बदलते हैं, तो दोनों कक्षाएं प्रभावित होंगी और आपके पास "हाय" और "हाय, मॉमी" होगा।

सुपर सुपरक्लास द्वारा परिभाषित विधि को कॉल करने के लिए सुपर का उपयोग किया जाता है। इसका उपयोग उप-वर्गों द्वारा ओवरराइड किए गए तरीकों तक पहुंचने के लिए किया जाता है ताकि कक्षा अपने कोड को एक विधि के चारों ओर लपेट सके जो कि यह मूल वर्ग के उपकरण है। यदि आप किसी तरह की विरासत कर रहे हैं तो यह बहुत आसान है।

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