back to top

Funzione main e gestione della memoria – Guida Sviluppo App iOS

All’interno della cartella Other sources è presente il file main.m. Come in una qualsiasi applicazione C-based, il punto di ingresso di un’applicazione iOS al momento del lancio dell’applicazione è proprio la funzione main.

L’implementazione di questa funzione main è minimale e, nella realizzazione delle vostre applicazioni, non avrete alcuna necessità di modificare questa funzione.

Andiamo adesso ad analizzare il codice contenuto all’interno della funzione main:

int main(int argc, char *argv[]) {

  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  int retVal = UIApplicationMain(argc, argv, nil, nil);
  [pool release];
  return retVal;
}
Come possiamo vedere, la prima operazione che viene eseguita è quella di istanziare un oggetto di tipo Autorelease Pool. Un oggetto di questo tipo rappresenta il gestore della memoria relativo alla nostra applicazione. Su i dispositivi iOS non è presente nessun tipo di Garbage Collection in quanto la memoria dei dispositivi è molto limitata e quindi è necessario l’utilizzo di un gestore di memoria (Autorelease Pool) molto più complesso rispetto al Garbage Collection. Lo scopo dell’Autorelease Pool è quello di evitare che oggetti “inutili” siano mantenuti in memoria e che quindi venga occupato dello spazio prezioso per risorse che magari non sono più necessarie per il corretto svolgimento dell’applicazione.

Ma come fa l’Autorelease Pool a capire se un oggetto è utile o inutile? Per svolgere i suoi compiti Autorelease Pool sfrutta una proprietà che tutti gli oggetti hanno in Objective C ovvero il retainCount che rappresenta ciò che precedentemente avevamo identificato come il contatore di riferimenti per quell’oggetto. Quando il contatore di un oggetto raggiunge valore zero, viene automaticamente eliminato dalla memoria dall’Autorealease Pool e dunque gli oggetti che riteniamo necessari per la corretta esecuzione dell’applicazione dovranno mantenere sempre un retainCount maggiore o uguale a 1.

La gestione della memoria eseguita in maniera efficiente è un punto cruciale quando si sviluppa per dispositive mobile o dispositivi in cui si hanno delle risorse limitate.

Negli esempi precedenti abbiamo visto che per ogni attributo della classe (che è un oggetto) veniva effettuato il release nel metodo dealloc della classe. Può capitare, però, all’interno di un metodo, di dover dichiarare alcuni oggetti per poter espletare la funzione richiesta al metodo stesso. In questo caso il release di questi oggetti non deve essere inserito nel dealloc (perchè il dealloc lavora esclusivamente sugli attributi della classe), il release per l’oggetto deve essere, dunque, inserito nel metodo stesso e deve essere effettuato quando l’oggetto non è più necessario. Ovviamente bisogna prestare attenzione al punto del codice in cui inserire il release dell’oggetto, perchè se per esempio allocate ed inizializzate un oggetto, fate il release e poi lo passate come argomento ad un altro metodo, l’applicazione andrà ovviamente in crash.

In questo paragrafo abbiamo spiegato solo i concetti principali della gestione della memoria, se si vuole approfondire l’argomento si consiglia di leggere la documentazione Apple.

Proseguendo nella nostra analisi del codice, troviamo la chiamata alla funzione UIApplicationMain che è una funzione importantissima in quanto ha il compito di inizializzare la nostra applicazione con i quattro parametri di sistema che gli vengono passati come argomento.

Oggetto Delegate

Nella lezione precedente, durante l’analisi di un’applicazione window-based, abbiamo incontrato il termine appDelegate. Ma che cosa è questo appDelegate?

Sostanzialmente, il delegate (o delegato) rappresenta un pattern di programmazione nel quale viene delegato, ad una determinata classe, il comportamento ad alto livello. Utilizzeremo il delegate quando sarà presente un controller (vedremo più avanti di cui si tratta) che rileva, per esempio, un cambio di stato dell’applicazione per poi segnalarlo al delegate stesso il quale compierà una determinata operazione.

L’oggetto delegate gestisce anche i vari messaggi critici di sistema e deve essere presente in ogni applicazione iOS. In applicazioni di grosse dimensioni avere un delegate per ogni modulo significativo consente di mantenere il codice ordinato e poterne fare manutenzione in maniera semplice ed intuitiva.

Pubblicitร 

In questa guida...