2012-11-15 12 views
6

है यह स्वीकार्य/ऑब्जेक्टिव-सी में सुरक्षित/कोको init विधि लपेटकर के रूप में निम्नानुसार हैं:का उपयोग करते हुए `स्वयं = [आत्म init]` रैप करने के लिए अन्य `init message`

-(id)init { 
    if ((self=[super init])) { 
     self.bar = [[Bar alloc] init]; 
    } 
    return self; 
} 

-(id)initWithFoo:(Foo *)f { 
    if ((self=[self init])) { 
     self.foo = f; 
    } 
    return self; 
} 

नोट [self init] में initWithFoo

शायद यह एक साधारण हां जवाब है ... स्पष्ट प्रतीत होता है, लेकिन मानक नहीं है?

+2

यह स्वीकार्य है। मेरी एकमात्र टिप्पणी दूसरी विधि के बारे में है। यह इस तरह कुछ उपयोग करने के लिए बेहतर है: - (आईडी) initWithFoo: (Foo) newFoo {.... self.foo = newFoo ....} –

+0

क्षमा करें, जल्दी से प्रश्न का वर्णन कर रहा था ... अर्थशास्त्र को सही करेगा – Ross

+4

मैं कहूंगा कि यह असामान्य है: आपका 'initWithFoo:' प्रारंभकर्ता है जो सबसे अधिक करता है। लेकिन यह एक और प्रारंभकर्ता को कॉल करके _indirectly_ करता है, जो कुछ और करता है। सामान्य (और _good! _) अभ्यास _one_ नामित प्रारंभकर्ता है। सबसे विशिष्ट एक, एक अन्य सभी प्रारंभकर्ता डिफ़ॉल्ट तर्क के साथ कॉल करते हैं। और यह दो नंबर होगा, क्योंकि यह दो इवार्स शुरू करता है: 'foo' और' bar'। – danyowdee

उत्तर

8

यह निश्चित रूप से स्वीकार्य और सुरक्षित है। मुझे यकीन नहीं है कि यह मानक अभ्यास है, लेकिन मुझे नहीं लगता कि यह बुरा अभ्यास है।

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

+0

अतिरिक्त 'नोट' के लिए धन्यवाद, हमेशा सराहना की। – Ross

+3

यह निश्चित रूप से मानक अभ्यास है। यह _ डिज़ाइन किए गए प्रारंभकर्ता_ का पूरा बिंदु है। Http://developer.apple.com/library/ios/#documentation/general/conceptual/DevPedia-CocoaCore/MultipleInitializers.html देखें – Sulthan

2

मुझे पता है कि मैं पार्टी के लिए देर हो चुकी हूं लेकिन मैंने सोचा कि मैं अपने दो सेंट जोड़ दूंगा।

तुम दोनों एक init (जो आप निश्चित रूप से करना होगा) और एक initWithBlah प्रदान तो आप सबसे अच्छा कुछ इस तरह कर रही होगी ...

- (id)initWithValue:(int)value 
{ 
    self = [super init]; 
    if (self) { 
     self.value = value; 
    } 
    return self; 
} 

- (id)init 
{ 
    int defaultValue = 10; 

    return [self initWithValue:defaultValue]; 
} 
संबंधित मुद्दे