Self e [super init]

di il
22 risposte

Self e [super init]

Salve a tutti, è da poco che mi sono avvicinato all'objective c ed ho 2 domande per voi che sicuramente ne saprete più di me(molto di più ):

1) A cosa serve il puntatore self a livello pratico

2)Se devo effettuare l'overriding del metodo init ad esempio nel seguente modo:

-(id)init
{
    self=[super init];
    
    if(self!=Nil)
    {
        NSLog(@"Questa e' la init "modificata"");
    }
    return self;
}
Non riesco a capire il perché deve ritornare il self(forse appunto perché non ho capito self) e poi a cosa serve:

self=[super init];
cioè perché self deve assumere valore della init della superclasse(NSObject)

Mi scuso per la lunghezza e vi ringrazio a tutti anticipatamente

22 Risposte

  • Re: Self e [super init]

    Ciao, puoi vedere questa discussione: http://www.iprogrammatori.it/forum-programmazione/apple-ios-objectivec/classi-objective-t13777.html
    Occhio, che Nil è diverso da nil. In particolare nil è un puntatore a un oggetto nullo, mentre Nil è un puntatore a una classe nulla.
  • Re: Self e [super init]

    Quell discussione già l'ho letta, solo che non spiega cos'è e l'utilizzo di self
  • Re: Self e [super init]

    Nessuno che mi può aiutare?
  • Re: Self e [super init]

    Self è un riferimento all'oggetto corrente. Se hai mai usato Java è l'equivalente di this.
  • Re: Self e [super init]

    Comunque scusami non mi ero accorto che eri tu anche nell'altra discussione
  • Re: Self e [super init]

    È proprio questa frase:"riferimento all'oggetto corrente", che mi manda al manicomio, l'ho letta su migliaia di siti ma in pratica cosa vuol dire? Mi potresti fare un esempio pratico.Ti ringrazio ancora per la disponibilità
  • Re: Self e [super init]

    Della ha scritto:


    Comunque scusami non mi ero accorto che eri tu anche nell'altra discussione
    a vabbè non ti preoccupare
  • Re: Self e [super init]

    Provo a farti un esempio:
    
    //File ACLass.h
    #import <Foundation/Foundation.h>
    
    @interface AClass : NSObject
    
    @property (readonly) int n;
    
    -(void) aMethod:(int) n;
    
    -(void) anotherMethod:(int) n;
    
    @end
    
    //File AClass.m
    #import "AClass.h"
    
    @implementation AClass
    
    @synthesize n;
    
    -(void)aMethod:(int)n
    {
        self->n = n;
    }
    
    -(void)anotherMethod:(int)n
    {
        n = n;
    }
    @end
    
    //main
    
    #import <Foundation/Foundation.h>
    #import "AClass.h"
    
    int main(int argc, const char * argv[])
    {
        AClass* obj1 = [[AClass alloc] init];
        AClass* obj2 = [[AClass alloc] init];
        
        [obj1 aMethod:1];
        [obj2 anotherMethod:2];
        
        NSLog(@"obj1 = %d",obj1.n);
        NSLog(@"obj2 = %d",obj2.n);
    }
    
    Se esegui il codice puoi notare che l'output sarà:
    obj1 = 1;
    obj2 = 0;

    Questo perché nel metodo "aMethod" si utilizza "self->n", ovvero si va ad impostare la proprietà "n" dell'oggetto che chiama il metodo (in questo caso obj1). Nel metodo "anotherMethod", invece, l'istruzione "n = n" è praticamente inutile, poiché "n" è il parametro del metodo.

    Se ancora non ti è chiaro ti consiglio di vedere questo video
  • Re: Self e [super init]

    A ok il fatto del self quando ci sono due variabili chiamate nello stesso modo ora mi é chiaro. Solo che mi sorge una domanda: A cosa serve il self nel caso dell'overriding di init? Mica ci sono variabili con lo stesso nome
  • Re: Self e [super init]

    Ti do la mia interpretazione, se qualcuno ne sa di più è ben accetto
    Nel caso in cui la init abbia successo l'assegnamento è inutile. Nel caso in cui fallisca, però, la init restituisce nil. Quindi l'oggetto può essere parzialmente inizializzato. Mettendo self = [super init] in caso di fallimento automaticamente mettiamo self = nil. Credo che il motivo sia solo questo.
  • Re: Self e [super init]

    Si ok però cioè perché bisogna assegnare la classe( e quindi self) a il metodo init della superasse, cioè sono due cose diverse. questo che non capisco
  • Re: Self e [super init]

    Self non è la classe ma un oggetto. In particolare è l'oggetto che sta eseguendo un determinato metodo.

    Provo a farti un altro esempio: (mi scuso per eventuali errori ma in questo momento non ho un mac a disposizione e quindi non posso provare se funziona tutto..però concettualmente funziona)
    
    @interface MyClass : NSObject
    @property (readonly) NSString* nome;
    -(void) metodo;
    -(void) initWithNome:(NSString*) unNome;
    @end
    
    @implementation MyClass
    
    @synthesize nome;
    
    -(void) initWithNome:(NSString*) unNome
    {
    	self = [super init];
    	if(self){
    		self.nome = unNome;
    	}
    }
    
    -(void) metodo
    {
    	NSLog(@"%@",self.nome);
    }
    @end 
    
    int main(){
    	MyClass* obj1 = [[MyClass alloc] initWithNome:@"Primo oggetto"];
    	MyClass* obj2 = [[MyClass alloc] initWithNome:@"Secondo oggetto"];
    	
    	[obj1 metodo];
    	[obj2 metodo];
    }
    
    L'output dovrebbe essere:
    Primo oggetto
    Secondo oggetto

    Questo per dire che "self" è l'oggetto corrente, ovvero l'oggetto che sta eseguendo in questo momento questo metodo.
  • Re: Self e [super init]

    No ma diciamo che il fatto del controllo del self se ottiene valore nil più o meno l'ho capita, quello che proprio non mi entra in testa è perché il self deve avere l'indirizzo della self ritornata dalla init della superclasse.
    Cioè quando istanzio l'oggetto eseguo la init "modificata" da me(override) e non quella della classe nsobject, quindi che senso ha assegnare il valore ritornato dalla init della superclasse. Se quando istanzio l'oggetto eseguo la init "modificata" come fa la init della superclasse ad avere,eventualmente valore nil ?
    Non so se mi sono spiegato bene
  • Re: Self e [super init]

    Nel caso di classi che derivano direttamente da NSObject in effetti è praticamente inutile.
    Prova, però, a pensare ad una tua classe C, che magari accetta un file per l'inizializzazione. Pensa poi ad una sua sottoclasse S. Se nell'inizializzazione dell'oggetto si passa un percorso non valido, il metodo init di C fallirà restituendo nil. Se nell'init di S non metti "self = [super initWithFile:aFile]" allora self non punterà a nil ma ad un oggetto non correttamente inizializzato, e avresti un errore.
Devi accedere o registrarti per scrivere nel forum
22 risposte