Setarea unui obiect zero față de versiunea + realloc

voturi
9

Acest lucru nu este un mediu de gunoi colectate

Am o variabilă de clasă instanță care, la un moment dat în timpul rulării mea, am nevoie să re-inițializa cu un alt set de date decât a fost inițial construit cu.

Ipotetic vorbind, ce se întâmplă dacă am o NSMutableArraysau NSMutableDictionary, ar fi mai eficient de a face ceva , cum ar fi:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

sau doar,

myArr = nil;

Va elibera myArr obiectul și lasă-mă fără un pointer la stocarea în memorie, așa că am putea re-utilizare myArr?

Întrebat 09/03/2009 la 17:03
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
21

Dacă faci myArr=nil;de la sine, atunci ați pierdut indicatorul la care puteți trimite releasemesajul. Nu există nici o magie a releaseobiectului.

Și, după cum spune Georg, fără a putea elibera obiectului, memoria sa „scurs“.

Publicat 09/03/2009 la 17:07
sursa de către utilizator

voturi
6

Ai putea folosi o proprietate și de a obține aproape sintaxa pe care doriți, fără scurgere de memorie.

Utilizați această sintaxă pentru a declara matrice

@property (readwrite, retain) NSMutableArray *myArray;

Apoi, re-inițializa-l astfel:

[self setMyArray:[NSMutableArray array]];
Publicat 09/03/2009 la 17:59
sursa de către utilizator

voturi
5

Dacă ați fost pe Mac OS, nu iPhone OS aș spune că aceasta depinde de faptul dacă colectorul de gunoi este activat sau nu:

  • cu GC: utilizare myArr = nil;
  • fără GC: utilizare [myArr release];

Din păcate, pe iPhone, nu există nici o colectare a gunoiului, așa că, dacă nu doriți pierderi de memorie, trebuie să elibereze obiectul dvs. odată ce nu mai este nevoie de ea.

Publicat 09/03/2009 la 17:13
sursa de către utilizator

voturi
4

Primul bloc de cod este bine. Cu toate acestea, al doilea bloc nu te las cu o matrice puteți utiliza astfel încât nu este suficient. corectând Jumătate acel bloc, cred că vrei să spui:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Cu toate acestea, acest lucru nu realiza ceea ce doriți, fie pentru că nu sunt de eliberare myArr. Dacă ați sintetizat un setter pentru myArr, atunci puteți obține comportamentul de eliberare pe care doriți de la setarea la zero, folosind setter (self.myArr) în loc de a accesa indicatorul direct (myArr). Corectarea blocul complet al doilea:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Acum avem exemple de cod echivalente, unul utilizând setter cu zero pentru a elibera, celălalt nu. Sunt la fel.

Dacă myArr este o matrice mutabil ca în aceste exemple, cea mai eficientă metodă este de a utiliza removeAllObjects, evitând toate lucrările de eliberare a memoriei doar să-l recuperăm:

[myArr removeAllObjects];
Publicat 02/12/2009 la 11:08
sursa de către utilizator

voturi
1

Dacă ceea ce doriți este să resetați conținutul unui NSMutableArray / NSMutableDictionary, puteți apela, de asemenea, removeAllObjects și aveți un proaspăt matrice / dict pentru a lucra cu.

Publicat 13/03/2009 la 22:37
sursa de către utilizator

voturi
1

O modalitate de a realiza diferența ar putea fi aceasta: Setarea o referință la un obiect la zero nu face nimic la obiect, face doar ceva de referință.

„Eliberarea obiectului“ nu este „nimic“, așa că nu face asta. :) Într-o limbă de gunoi colectate s-ar putea face acest lucru ca un efect secundar al renunțându-se la, dar în obiectivul C nu funcționează în acest fel.

Publicat 09/03/2009 la 17:09
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more