Managementul memoriei in iOS 5

Introducere

Automatic Reference Counting este o funcţie noua, adăugată in iOS 5. Aceasta scapă programatatorul de efortul de a manageria manual memoria. Vom prezenta pe scurt cum era managementul memoriei înainte de iOS 5 şi apoi cum ne vine în ajutor Automatic Reference Counting.

Cuprins

Inainte de iOS 5

iOS nu are Garbage Collector. Managementul memoriei se realizează prin “Reference counting”. Practic, fiecare obiect are asociat un contor. Când acesta este creat, contorul are valoarea 1. Dacă altcineva vrea să-l ţină în viaţă pentru că are nevoie de el, va face “retain” pe el şi contorul va creşte cu 1. Când nu va mai avea nevoie de obiect, acesta va face “release” şi contorul scade cu 1. În momentul în care contorul ajunge la 0, obiectul este dealocat. Acest sistem se numeşte “Reference counting”.

Regula era simpla: de fiecare dată când se obţine ownershipul pe un obiect(de exemplu, prin crearea lui cu ajutorul metodelor alloc şi init) se face release când nu mai este nevoie de obiect.

Dupa iOS 5

“Automatic Reference Counting” ne scapă de aceste bătai de cap. Nu este Garbage Collector, este în continuare “Reference counting” doar că totul se realizează automat. Totuşi trebuie să avem în vedere nişte noţiuni:

Strong pointer

De menționat înca de la început că toţi pointerii sunt by default de tipul strong.

Este foarte important de reţinut următorul lucru: un obiect rămane în memorie, atâta timp cât cineva are un pointer către el. Dacă nimeni nu mai ţine un pointer către obiect, acesta este şters din memorie.

Să luam un exemplu:

Exemplu 1

NSString *obiectString = [NSString stringWithString:@"O valoare random"];

În memorie în acest moment este un obiect de tipul NSString cu valoarea “O valoare random”, deoarece există un pointer către el.

Exemplu 2

NSString *obiectString = [NSString stringWithString:@"O valoare random"];
obiectString = @"Alta valoare";

În acest moment, obiectul anterior de tipul NSString cu valoarea “O valoare random” este scos din memorie, deoarece nu mai există niciun pointer către obiect. “obiectString” conţine acum un pointer către alta valoare.

Exemplu 3

NSString *obiectString = [NSString stringWithString:@"titlu"];
self.textField.text = obiectString;

Acum există 2 pointeri strong către obiectul NSString cu valoarea “titlu”.

Exemplu 4

NSString *obiectString = [NSString stringWithString:@"titlu"];
self.textField.text = obiectString;
self.textField.text = @"Alta valoare";

Obiectul NSString cu valoarea “titlu” nu este scos din memorie deoarece există înca variabila “obiectString” care are în continuare un pointer strong către obiect.

Weak pointer

Deosebirea dintre un pointer weak şi un pointer strong este că un pointer weak nu se pune ca ownership. Cu alte cuvinte, dacă un obiect are un singur pointer weak către el, acesta este dealocat.
Exemplu:

Obiect *obiect = [[Obiect alloc] init];
__weak Obiect *altObiect = obiect;

Obiectul creat are 2 pointeri către el: unul strong (*obiect) şi unul weak (*altObiect). Dacă se dă o altă valoare textLabel-ului obiectul este dealocat chiar dacă “obiectString” înca are un pointer către el, deoarece acest pointer este de tip “weak”:

Obiect *obiect = [[Obiect alloc] init];
__weak Obiect *altObiect = obiect;
obiect = [[Obiect alloc] init];
NSLog(@"%@",obiectString) //output : (null)

Pe de alta parte daca pointerul “altObiect” era de tipul strong, rezultatul din NSLog nu mai era (null).

Pointeri de tip “weak” se folosesc in situatiile de tip parinte-copil. Parintele tine un pointer la copil si de asemenea copilul tine un pointer la parinte. Daca ambii pointeri sunt strong, chiar daca nu mai avem nevoie de parinte si nu mai tinem nici un pointer la el, copilul tot va avea un pointer strong. De asemenea, parintele are un pointer strong catre copil. Astfel, se intra intr-un ciclu in care cele doua obiecte nu pot fi scoase din memorie. Pentru a evita o astfel de situatie, copilul are un pointer de tip weak catre parinte.

programare_ios/curs/curs6.txt · Ultima modificare: 2013/07/28 16:41 de către bogdan.vlad
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0