2009-03-02 12 views
18

Desidero scrivere alcuni metodi in una classe in modo che altre classi possano chiamare questi metodi utilizzando [instance methodName:Parameter].Come inizializzare la sottoclasse di NSObject su iPhone?

Se la classe è una sottoclasse di UIViewController, è possibile utilizzare initWithNibName per inizializzarlo. Ma voglio scrivere i metodi in una sottoclasse di NSObject di NSObject, come posso inizializzarla?

risposta

-2

Trovo questo può funzionare:

TheClass *newObject = [[TheClass alloc] init]; 
//do something here 
[newObject release];
+1

Ciò significa semplicemente inizializzare l'oggetto "newObject" come classe TheClass. Se TheClass non implementa "- (id) init" con "[super init]" e "return self;", l'inizializzazione probabilmente fallirà. – Klompengard

57

iphony è corretto, ma lui o lei non dice che è necessario scrivere il metodo init da soli. Il vostro metodo init dovrebbe generalmente essere simile a questa:

- (id) init 
    { 
    if (self = [super init]) 
     { 
     myMember1 = 0; // do your own initialisation here 
     myMember2 = 0; 
     } 
    return self; 
    } 

Anche se il apple documentation dice

Il metodo init definito nella classe NSObject non fa di inizializzazione; semplicemente restituisce se stesso.

e si può solo essere tentati di scrivere

- (id) init 
    { 
    myMember1 = 0; // do your own initialisation here 
    myMember2 = 0; 
    return self; 
    } 

Questo è sbagliato e non seguendo ciò che è esplicitamente dichiarato nella documentazione:

In un'implementazione personalizzata di questo metodo (init) , è necessario richiamare l'inizializzatore designato di Super , quindi inizializzare e restituire il nuovo oggetto.

DEVE. Non dovrebbe, potrebbe, dovrebbe, ecc.

Non si deve assumere che init di NSObject non cambi in futuro; né la superclasse da cui deriva la tua classe personalizzata.

+0

è [super init] necessario? perché la documentazione del metodo init di NSObject dice diversamente. – santhu

+0

Uno non dovrebbe mai omettere super init! Anche se non fa nulla. I documenti dicono esplicitamente: "In un'implementazione personalizzata di questo metodo, è necessario richiamare l'inizializzatore designato da Super, quindi inizializzare e restituire il nuovo oggetto." Ho modificato la risposta. – manicaesar

Problemi correlati