«

»

Set 21

Gestione della memoria in iOS – Concetti Base

In un sistema iOS il garbage collector non esiste, perciò sarà nostro compito tenere traccia di quali oggetti abbiamo bisogno e di quali non sono più necessari; se non prestiamo attenzione a questo fatto andremo sicuramente incontro a dei memory leak, cioè degli spazi di memoria inutilizzati. Se i memory leak non vengono preventivamente evitati, la nostra App continuerà a consumare sempre più memoria fino ad arrivare ad un eventuale crash.

Per evitare questi inconvenienti, cerchiamo di capire come vengono gestiti gli oggetti in memoria. iOS utilizza un modello di gestione reference counting, significa che viene utilizzato un contatore per conoscere quanti riferimenti a un oggetto ci sono. Quando questo contatore raggiunge lo zero, la memoria occupata dall’oggetto viene rilasciata.

Vediamo ora un esempio molto semplice:

 NSString *myString = [[NSString alloc] init];
...utilizziamo myString...
[myString release];

Grazie al metodo alloc, il contatore, chiamato retain counter, ha valore 1. Dopo aver terminato di utilizzare l’oggetto myString, bisogna rilasciarlo dalla memoria. Tramite il metodo release possiamo decrementare il valore del retain counter fino a raggiungere il valore 0, a questo punto la memoria occupata dall’oggetto viene liberata.

E’ bene ricordarsi che release non è un metodo che rilascia la memoria dell’oggetto, ma decrementa solo il retain counter, il vero metodo che libera la memoria è dealloc, che non va mai chiamato direttamente da noi! Viene chiamato automaticamente quando il retain counter di un oggetto raggiunge lo zero.

Una regola molto importante da ricordare è quella del possesso (in inglese ownership) degli oggetti: un’oggetto può avere uno o più possessori, rimane in memoria finché ci sarà almeno un possessore. Quando non ha più possessori, viene rimosso dalla memoria.

Ma quando abbiamo il possesso di un oggetto? Ecco una lista di punti da seguire:

  • Il possesso di un oggetto si ottiene grazie alla creazione dell’oggetto stesso, per esempio tramite i metodi alloccopy
  • Tramite l’utilizzo del metodo retain possiamo acquisire il possesso di un oggetto

Quando un oggetto non viene più utilizzato dovremmo abbandonarlo, cioè fare in modo che non sia più in nostro possesso. Si fa tramite i metodi release autorelease.

Gli oggetti che non ci appartengono non vanno abbandonati, quindi release e autorelease non vanno assolutamente usati su questi oggetti.

Di seguito trovate degli esempi su cosa non fare e cosa è corretto.

COSE DA NON FARE

NSString *identifier = [ContentManager projectIdentifier];
NSLog(@"Id: %@", identifier);
[identifier release];

Non dovete lanciare release sull’oggetto identifier perché non vi appartiene.

COSE CORRETTE

NSString *identifier = [[ContentManager projectIdentifier] retain];
NSLog(@"Id: %@", identifier);
[identifier release];

Questo codice è corretto perché tramite retain otteniamo il possesso dell’oggetto puntato da identifier, quando abbiamo finito di utilizzarlo tramite release lo abbandoniamo.

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>