back to top

Objective C: implementazione di una classe (esempio pratico) – Guida Sviluppo App iOS

Abbiamo visto, nella lezione precedente, come strutturare il file header per la definizione di una nuova una classe. Andiamo adesso a vedere come viene eseguita l’implementazione della classe nel file .m.

Come d’abitudine vediamo un breve listato di codice che poi andremo ad analizzare:

#import "MiaClasse.h"

@implementation MiaClasse

-(void)comparaStringa:(NSString *)stringa2 {
  miaStringa = [[NSString alloc] initWithString:@"Hello World"];
  if([miaStringa isEqualToString:stringa2]){
    NSLog(@"UGUALI");
  }
}

@end

Come prima cosa facciamo notare che è indispensabile importare l’header file relativo alla classe; per fare ciò si utilizza

#import "MiaClasse.h"
Fatto questo si passa alla direttiva che dichiara l’implementazione della classe e ciò avviene grazie alla parola chiave @implementation seguita, ovviamente, dal nome della classe che andremo ad implementare, il quale deve essere identico a quello dichiarato nell’header file.
@implementation MiaClasse

L’implementazione della classe si chiude, infine, con la direttiva

@end

Vediamo ora come è strutturata l’implementazione dei metodi; torniamo, quindi, sul codice d’esempio mostrato sopra.

Prima di tutto abbiamo ripetuto il prototipo del metodo, già presente nell’header file della classe, per poi andare ad inserire il codice di implementazione all’interno di un blocco di parentesi graffe.

-(void)comparaStringa:(NSString *)stringa2 {
  ...
  ...
  ...
}

La prima riga di codice di implementazione (cioè il codice contenuto nelle parentesi graffe) è utile per spiegare, in maniera più approfondita, i concetti precedentemente accennati dell’allocazione di memoria e dei metodi di classe.

miaStringa = [[NSString alloc] initWithString:@"Hello World"];

Nel file header siamo andati a dichiarare un puntatore a stringa di nome miaStringa. Nel file di implementazione andremo ad allocare ed inizializzare la stringa.

Guardando il codice di esempio relativo all’allocazione e all’inizializzazione della stringa, si capisce anche in che modo in Objective C vengono invocati i metodi; si segue infatti questa sintassi [nomeOggetto nomeMetodo]. Nel caso in cui il metodo prenda in ingresso qualche parametro si useranno i : per passare tutti i parametri di cui necessita (vedremo più avanti un esempio a riguardo).

Torniamo adesso a parlare dell’allocazione della stringa: come possiamo vedere il metodo alloc viene invocato non utilizzando il nome dell’oggetto, ma bensì il nome della classe e si può quindi dedurre che il metodo alloc è definito come metodo di classe. Dopo l’allocazione viene effettuata l’inizializzazione dell’oggetto utilizzando, nel nostro caso d’esempio, il metodo initWithString.

E’ opportuno soffermarsi ulteriormente su questo punto e spendere un po’ di tempo sul perchè si è usato la sintassi [[nomeClasse alloc] init] e non la seguente:

miaStringa = [NSString alloc];
[miaString initWithString:@"Hello World"]; 
Nel nostro caso questa sintassi non crea grandi problemi, ma l’allocazione e l’inizializzazione eseguite come sopra è molto pericolosa, in quanto non viene catturato, in nessun modo, ciò che ritorna la funzione init.

Immaginiamo, infatti, di volere inizializzare una stringa con il contenuto di un file utilizzando il metodo initFromFile. Se per errore viene passato al metodo un nome errato di un file, avremo che la funzione init fallirà, non inizializzerà l’oggetto e ritornerà nil. Dato che non abbiamo catturato il valore di ritorno della funzione di inizializzazione non sappiamo che il nostro oggetto vale nil e se andassimo ad invocare un qualsiasi metodo per quell’oggetto otterremo solamente il crash dell’applicazione. Dato che, la sintassi utilizzata, dal punto di vista del compilatore è una sintassi accettata non verrà notificato nessun tipo di errore e su applicazioni con tante linee di codice impazzirete a trovare l’errore.

E’ buona norma dunque utilizzare sempre la sintassi mostrata nell’esempio originario.

Andando avanti nell’analisi del codice di esempio, vediamo che dopo l’inizializzazione è presente un if dove vengono comparate due stringhe (il metodo isEqualToString ritorna un booleano).

if([miaStringa isEqualToString:stringa2]){
  ...
}

Il metodo NSLog(), che viene eseguito in caso di successo dell’istruzione condizionale, permette di scrivere sul log dell’applicazione.

Pubblicitร 

In questa guida...