2010-11-03 3 views
6

Se non vogliamo implementare il metodo init nella nostra classe, e tenendo presente che init in NSObject restituisce solo un'istanza dell'oggetto senza inizializzazione, non vedo il punto di chiamare init se abbiamo già l'istanza con alloc. Ho provato e funziona, ma non sono sicuro che non causerà problemi futuri.Sarebbe corretto/ellegante utilizzare solo l'allocazione senza init?

myClass *newObject = [myClass alloc]; 

invece di:

myClass *newObject = [[myClass alloc] init]; 

Grazie mille.

risposta

16

No, chiamare semplicemente alloc non sarebbe corretto. alloc azzera tutte le variabili di istanza dell'oggetto, init quindi ha la possibilità di impostare tutte o alcune variabili di istanza sui valori predefiniti. Alcune classi usano persino i loro metodi init per creare un'altra istanza e restituire quella invece di quella assegnata.

Molte classi si aspettano che vengano chiamati i loro metodi init e che potrebbero causare arresti anomali se non si chiama init. Se si sta parlando di una classe personalizzata che eredita direttamente da NSObject e non ha bisogno di inizializzare le variabili di istanza, è possibile che si passi indietro con [myClass alloc] ma non è sicuramente uno stile di programmazione valido.

+0

Grazie mille per la spiegazione. "Se stai parlando di una classe personalizzata che eredita direttamente da NSObject e non ha bisogno di inizializzare le variabili di istanza, potresti farla franca con [allocazione myClass] ma non è sicuramente un buon stile di programmazione." Era il mio caso. Risposta accettata – toupper

+2

@toupper: Vale la pena ricordare che se si desidera una sintassi più breve, si può fare '[myClass new];' che è equivalente a '[[myClass alloc] init];', ma difficilmente si può considerare che sia in voga . –

2

Penso che non sia una buona idea.
Leggi Cocoa Design Pattern, in particolare la "creazione a due stadi"

È inoltre possibile leggere questo articolo http://www.informit.com/articles/article.aspx?p=1398610

+0

Grazie mille, informazioni utili. – toupper

+0

Non ho capito completamente il concetto "Cocoa Design Pattern - Two stage creation": sostiene che la creazione a due stadi è migliore perché evita l'esplosione di "costruttori/metodi di classe/metodi di produzione", ma rispetto a java, non [[Foo alloc] init] uguale a Foo f = new Foo(); f.init() ;? –

0

Penso che sarebbe non importa molto se non ha implementare una "- (id) init "perché se lo facessi, chiameresti il ​​metodo init di NSObject che restituisce solo lo stesso valore che invii al metodo. Sebbene sia una buona idea creare il proprio metodo init per impostare la variabile di istanza.