Beállítása egy objektum nil versus kiadás + realloc

szavazat
9

Ez nem egy szemétgyűjtő környezet

Van egy osztály például változó, amely egy bizonyos ponton az én runtime, azt újra kell inicializálni egy másik adathalmazt, mint azt eredetileg épített.

Elméletileg szólva, mi van, ha van egy NSMutableArrayvagy NSMutableDictionarylenne-e hatékonyabb, hogy tegyen valamit, mint például:

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

vagy csak,

myArr = nil;

Will myArr engedje el a tárgyat, és hagyj nélkül egy mutatót a memóriában tároljuk, így tudok újra használni myArr?

A kérdést 09/03/2009 17:03
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
21

Ha nem myArr=nil;önmagában, akkor már elvesztette a mutatót, amely küldhet az releaseüzenetet. Nincs mágikus releasekívánt objektumot.

És, mint Georg mondja, anélkül, hogy engedje el a tárgyat, hogy az emlékezet már „kiszivárgott”.

Válaszolt 09/03/2009 17:07
a forrás felhasználó

szavazat
6

Jól jönne egy ingatlan, és kap szinte szintaxis kívánt nélkül memóriavesztés.

Használja ezt a szintaxist, hogy állapítsa meg a tömböt

@property (readwrite, retain) NSMutableArray *myArray;

Ezután újraindul, mint ez:

[self setMyArray:[NSMutableArray array]];
Válaszolt 09/03/2009 17:59
a forrás felhasználó

szavazat
5

Ha volt a Mac OS, nem iPhone OS azt mondanám, hogy ez attól függ, hogy a szemétgyűjtő van kapcsolva, vagy nem:

  • GC: használat myArr = nil;
  • nélkül GC: használat [myArr release];

Sajnos, az iPhone, nincs szemétgyűjtő, ezért ha nem szeretné, memóriavesztés, akkor engedje el a tárgyat, ha már nincs rá szükség.

Válaszolt 09/03/2009 17:13
a forrás felhasználó

szavazat
4

Az első kód blokk rendben van. Azonban a második blokk nem hagy egy sor használhatja, így ez nem elegendő. Half kijavítása hogy a blokk, azt hiszem, értem:

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

Ez azonban nem teljesíti, amit akar, vagy mert nem felszabadító myArr. Ha szintetizált egy setter myArr, akkor kap a kiadás viselkedést kívánt beállítást nulla volt, segítségével a szetter (self.myArr) helyett hozzáférését mutató közvetlenül (myArr). Kijavítása a második blokk teljesen:

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

Most egyenértékű kódot példák, az egyiket szetter a nullával, hogy kiadja, a másik pedig nem. Ezek ugyanazok.

Ha myArr egy változékony tömb ezekben a példákban, a leghatékonyabb módszer, hogy a removeAllObjects, elkerülve minden munkát a felszabadított memória csak azt állítják, hogy vissza:

[myArr removeAllObjects];
Válaszolt 02/12/2009 11:08
a forrás felhasználó

szavazat
1

Ha mi szeretnénk, hogy visszaállítja a tartalmát egy NSMutableArray / NSMutableDictionary, akkor is hívjon removeAllObjects és van egy újabb tömb / dict dolgozni.

Válaszolt 13/03/2009 22:37
a forrás felhasználó

szavazat
1

Az egyik módja, hogy észre a különbséget lehet ez: beállítása a hivatkozás egy tárgy nullára nem tesz semmit az objektumot, akkor csak csinál valamit a referencia.

„Elengedi a tárgy” nem „semmi”, így nem tehetem. :) Egy szemétgyûjtõ nyelv talán csinálni, mint egy mellékhatása csökken a referencia, de Objective C nem így működik.

Válaszolt 09/03/2009 17:09
a forrás felhasználó

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