2012-11-15 9 views
6

E 'accettabile/sicuro in Objective-C/Cocoa per avvolgere il metodo init come segue:Usando `auto = [sé init]` per avvolgere altro `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; 
} 

Nota la [self init] in initWithFoo.

forse questa è una semplice risposta sì ... sembra ovvia, ma non standard?

+2

è accettabile. Il mio unico commento riguarda il secondo metodo. È sempre meglio usare qualcosa del genere: - (id) initWithFoo: (Foo) newFoo {.... self.foo = newFoo ....} –

+0

scusate, stava rapidamente illustrando la domanda ... correggerò la semantica – Ross

+4

Direi che è raro: il tuo 'initWithFoo:' è l'inizializzatore che fa di più. Ma lo fa _indirettamente_ chiamando un altro inizializzatore, che fa qualcos'altro. La pratica comune (e _good! _) È quella di avere un inizializzatore designato _one_. Il più specifico, quello che tutti gli altri inizializzatori chiamano con argomenti predefiniti. E quello sarebbe il numero due, in quanto inizializza due ivars: 'pippo' e' bar'. – danyowdee

risposta

8

È certamente accettabile e sicuro. Non sono sicuro che sia una pratica standard, ma non penso che sia una cattiva pratica.

Nota: Questo non è sovraccarico. Il sovraccarico si riferisce a una cosa molto specifica nei linguaggi di tipo C (in particolare C++) in cui si hanno più funzioni con lo stesso nome, distinte solo dai loro numeri e/o tipi di parametri. Un termine migliore per questo sarebbe probabilmente qualcosa come inoltro o wrapping.

+0

grazie per la 'nota' extra, sempre apprezzata. – Ross

+3

È sicuramente una pratica standard. è l'intero punto di _inizializzazione designato_. Vedi http://developer.apple.com/library/ios/#documentation/general/conceptual/DevPedia-CocoaCore/MultipleInitializers.html – Sulthan

2

So che sono in ritardo per la festa ma ho pensato di aggiungere i miei due centesimi.

Se si fornisce sia un init (che sicuramente farà) e un initWithBlah allora si sarebbe meglio fare qualcosa di simile ...

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

- (id)init 
{ 
    int defaultValue = 10; 

    return [self initWithValue:defaultValue]; 
} 
Problemi correlati