2009-05-05 17 views
48

ऐप्पल के स्क्रॉल में उदाहरण देखें वे इसे कॉल नहीं करते हैं। मैंने हमेशा सोचा कि होना चाहिए। मुझे वैसे भी क्यों कॉल करना चाहिए?क्या मुझे हमेशा -viewDidLoad विधि में [सुपर व्यूडिडलोड] कॉल करना है?

उत्तर

9

आप [सुपर viewDidLoad]

जहाँ तक मुझे पता के रूप में कॉल करने के लिए नहीं है, सुपर क्लास में viewDidLoad (UIViewController) जब ViewController एक निब के साथ प्रारंभ हो जाता है कहा जाता हो जाता है कि केवल एक खाली समारोह है -file।

तो यदि आपको कोई प्रारंभिक करने की आवश्यकता है, तो आपको इस फ़ंक्शन को ओवरराइड करना चाहिए और अपना कोड वहां रखना चाहिए।

16

मार्कस कहता है, UIViewController इसके दृश्य में कुछ भी नहीं करता हैडलोड लोड विधि, इसलिए आपको इसे कॉल करने की आवश्यकता नहीं है। हालांकि, यदि आप अपनी विरासत संरचना को बदलते हैं और अचानक क्लास जो UIViewController से उत्तराधिकारी के लिए उपयोग किया जाता है, तो अब दृश्यडिडलोड विधि में कुछ करता है।

47

यदि आप विधि को ओवरराइड कर रहे हैं तो आपको अभी भी सुपर में विधि को कॉल करना चाहिए। यहां तक ​​कि यदि सुपर क्लास आज इसके साथ कुछ भी नहीं कर रही है, तो ऐप्पल एक दिन कार्यान्वयन को बदल सकता है और आपका कोड रहस्यमय तरीके से काम करना बंद कर देगा। यदि आपको वास्तव में उस विधि में कुछ भी करने की आवश्यकता नहीं है, तो इसे अपने कोड से पूरी तरह से छोड़ दें, और सुपर की विधि सामान्य रूप से आपके हिस्से पर हस्तक्षेप किए बिना चलती है।

27

नहीं, आप को की आवश्यकता नहीं है [सुपर व्यूडिडलोड] को कॉल करने के लिए। संपादित करें: लेकिन नीचे पढ़ें, क्योंकि मुझे लगता है कि आप निश्चित रूप से होना चाहिए।

चलो यहाँ असली रहें: ऐप्पल अपने प्रकाशित नमूना कोड के आधार पर हजारों ऐप्स तोड़ने वाला नहीं है, जिसमें वे वर्तमान में संभालने वाली घटना का निर्णय करके अचानक ऐसा कुछ करने की ज़रूरत है जो डेवलपर हो या नहीं रुकना चाहते हैं और यह महत्वपूर्ण है कि यदि आपको अलग-अलग व्यवहार की आवश्यकता नहीं है तो आप ईवेंट को रोक नहीं सकते हैं।

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

ऐप्पल को एक दिन भविष्य में एसडीके पर एक विशेष पैटर्न की आवश्यकता हो सकती है। जब तक आप नवीनतम एक्सकोड + एसडीके के साथ पुनर्निर्माण नहीं करेंगे तब तक यह आपको प्रभावित नहीं करेगा, लेकिन फिर आप इन ब्रेक को किसी भी स्रोत कोड में परिवर्तन के बिना प्राप्त करेंगे। सुरक्षित होने के लिए पैटर्न जानें और उसका पालन करें।

10

देखने के लिए ऐप्पल का दस्तावेजडिडलोड यह नहीं बताता कि आपको [सुपर व्यूडिडलोड] कॉल करना चाहिए, इसलिए मैं ऐप्पल के कहने के साथ जाऊंगा। नोट, हालांकि, अन्य समान तरीकों जैसे ViewDidAppear के लिए, आपको [super viewDidAppear] को कॉल करना होगा।

5

बस ध्यान दिया गया कि यदि आप इन कार्यों में सुपर कॉल नहीं करते हैं तो एक्सकोड 6 का स्थिर विश्लेषक चेतावनी जारी करता है। तो ऐसा लगता है कि ऐप्पल अब निश्चित रूप से हमें इसे कॉल करना चाहता है।

11

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

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

कोड:

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

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

कोड: // जनक

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

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

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

0

हालांकि xCode 7 बीटा/स्विफ्ट 2 super.viewDidLoad संकलित नहीं होगा। त्रुटि का कहना है कि यह केवल ओएसएक्स 10.10 में उपलब्ध है और ऑटो-फिक्स यह

if #available(OSX 10.10, *){ 
super.viewDidLoad()} 
else 
{ 
// Fallback on earlier versions 
} 
// My code 
} 
+1

स्पष्ट रूप से वह उद्देश्य-सी के बारे में पूछ रहा था! – AMTourky

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