2012-01-30 17 views
20

init और initWithNibName के बीच व्यावहारिक मतभेदों के बारे में और जानना चाहते हैं। this जैसे SO उत्तर बताते हैं कि "" अप्रत्यक्ष रूप से "init" के माध्यम से कॉल करना बेहतर है।UIViewController (init और initWithNibName)

  1. वहाँ किसी भी परिस्थिति है कि हम अलग ढंग से "init" और "initWithNibName" परिभाषित करने की जरूरत है?
  2. क्या यह संभव है कि किसी भी निब फ़ाइल को एक प्रोग्राम निष्पादन के दौरान से अधिक बार लोड किया जाना चाहिए?
  3. प्रश्न 1 & 2 अंतर से संबंधित हैं?

उत्तर

30

यह नहीं बेहतर init के माध्यम से परोक्ष रूप से initWithNibName: कॉल करने के लिए है । आप बस कुछ बिंदु पर initWithNibName: पर कॉल करना चाहते हैं। आप बाहरी या आंतरिक रूप से ऐसा कर सकते हैं। कुछ लोग सोचते हैं कि यह आंतरिक रूप से करना बेहतर है। मेरे पास वास्तव में "लेआउट यूटिल" नामक एक कक्षा है जिसे मैं लेआउट से संबंधित सहायक उपकरण रखता हूं ताकि लेआउट से संबंधित कोड के कड़े टुकड़े को लिखने से बच सकें। यहाँ एक UIViewController लोड करने के लिए मेरे कोड है:

+ (id)loadController:(Class)classType { 
    NSString *className = NSStringFromClass(classType); 
    UIViewController *controller = [[classType alloc] initWithNibName:className bundle:nil]; 
    return controller; 
} 

और फिर मैं सिर्फ कर सकते हैं:

MyViewController *c = [LayoutUtil loadController:[MyViewController class]]; 

यदि आप चाहते हैं, तो आप एक वर्ग के लिए ughhhh एक विधि कहा जाता है जोड़ सकते हैं और वहाँ में यह कह सकते हैं, इससे कोई फर्क नहीं पड़ता। मुद्दा यह है कि इनिट विधि में initWithNibName को कॉल करना बेहतर अभ्यास नहीं है, हालांकि, आप यह सुनिश्चित करना चाहते हैं कि आप इसे UIViewController शुरू करते समय किसी बिंदु पर कॉल करें।

- (id)ughhhh 
{ 
    self = [super initWithNibName:@"Myview" bundle:nil]; 
    if (self != nil) 
    { 
    } 
    return self; 
} 

एक निब फ़ाइल को निश्चित रूप से एक से अधिक बार लोड करने की आवश्यकता हो सकती है। प्रत्येक बार जब आप UIViewController पर initWithNibName को कॉल करते हैं तो xib को लोड करना होगा।

[[NSBundle mainBundle] loadNibNamed:@"nameOfXIBFile" owner:self options:nil]; 

हर आप इस समारोह आप निब लोड हो रहा है हो जाएगा कहते हैं: लोगों का एक बहुत UIViews है कि इस तरह एक UIViewController का स्वामित्व नहीं होता लोड।

कुछ ऐसे मामले हैं जहां एक निब को कैश किया जा सकता है। एक उदाहरण UITableView होगा - लेकिन तालिका दृश्य इसे अपने स्वयं के कैश लागू करता है। ऑपरेटिंग सिस्टम स्वचालित रूप से कोई कैशिंग नहीं कर रहा है।

init और initWithNibName: उस initWithNibName: से संबंधित हैं स्वचालित रूप से किसी ऑब्जेक्ट पर इनिट कॉल करते हैं।

+1

+1, बहुत अच्छी तरह से विस्तृत ... – doNotCheckMyBlog

+0

अपने विस्तृत जवाब और तरह सहायता ... – Stanley

+1

बस एक नोट के लिए धन्यवाद: आत्म करने के लिए आवंटित करने के लिए, आप की जरूरत 'init' से शुरू करने के लिए एक विधि है। तो '- (आईडी) initUghhhh – benaneesh

2

पहला सवाल का

आदर्श रूप में उत्तर हर initWithNibName कॉल init आंतरिक रूप से तो आप सामान्य स्थिति में दोनों परिभाषित करने की जरूरत नहीं है, लेकिन आप कर सकते हैं अगर देखें भी रूप में एक मामले नोक में और fron loadView से भरी हुई है अलग-अलग दृश्यों से एक और मामले में अच्छी तरह से।

दूसरा सवाल का

उत्तर

हर देखें ढेर नोक में धकेल दिया जाता है

तीसरा सवाल का जवाब भरी हुई है

नहीं

+0

अपने जवाब और तरह की सहायता के लिए धन्यवाद ... – Stanley

10

यह initWithNibName "अप्रत्यक्ष रूप से" init "के माध्यम से 'कॉल करने के लिए बेहतर' नहीं है। आपको अपनी जरूरतों के अनुरूप किसी भी चीज का उपयोग करना चाहिए। [[UIViewController alloc] init] कहकर [[UIViewController alloc] initWithNibName:nil bundle:nil] कहने जैसा है, इसलिए यदि वे तर्क हैं जिन्हें आप पास करना चाहते हैं, तो आप [[UIViewController alloc] init] का भी उपयोग कर सकते हैं।

जवाब में अपने प्रश्नों के:

  1. आप को परिभाषित कर सकते init और initWithNibName:bundle: अलग तरह से आप चाहते हैं। आप उनमें से केवल एक को परिभाषित कर सकते हैं। उदाहरण के लिए, UIImagePickerController केवल init को परिभाषित करता है, और यदि आप इसे initWithNibName:bundle: भेजना चाहते हैं, तो यह ठीक से काम नहीं करेगा। या आप कुछ पूरी तरह अलग init... विधि परिभाषित कर सकते हैं। उदाहरण के लिए, UINavigationController केवल initWithRootViewController: परिभाषित करता है। जो भी अंतर्निहित तरीके आप परिभाषित करते हैं, उसे अंततः अपने सुपरक्लास की इनिट विधियों में से एक को कॉल करना होगा।

  2. हां, एक निब कई बार लोड किया जा सकता है। यदि आप एक ही दृश्य नियंत्रक सबक्लास के कई उदाहरण बनाते हैं, तो संभवतः आप एक ही निब को कई बार लोड करेंगे। वास्तव में, एकल दृश्य नियंत्रक के उदाहरण के लिए कई बार अपने निब लोड करने के लिए यह संभव है। कैसे? यदि दृश्य नियंत्रक का दृश्य वर्तमान में स्क्रीन पर नहीं है, और सिस्टम स्मृति पर कम चलाता है, तो सिस्टम व्यू कंट्रोलर से अपना विचार जारी करने के लिए कहेंगे। यदि दृश्य नियंत्रक को बाद में स्क्रीन पर अपना दृश्य वापस रखना होगा, तो यह फिर से निब लोड करेगा।

  3. प्रश्न 1 और 2 संबंधित नहीं हैं।

+0

आपके विस्तृत उत्तर और दयालु सहायता के लिए धन्यवाद ... – Stanley

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