Ustawianie obiektu nil kontra uwalnianiu + realloc

głosy
9

To nie jest środowisko śmieci zebrane

Mam instancji klasy zmienną, która w pewnym momencie w moim środowisku wykonawczym, muszę ponownie zainicjować z innym zestawem danych niż to było pierwotnie zbudowane z.

Hipotetycznie rzecz biorąc, co jeśli mam NSMutableArraylub NSMutableDictionarybyłoby bardziej efektywne, aby zrobić coś takiego jak:

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

Lub tylko,

myArr = nil;

Będzie myarr zwolnić obiekt i zostawić mnie bez wskaźnik do przechowywania w pamięci, więc mogę ponowne wykorzystanie myarr?

Utwórz 09/03/2009 o 17:03
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
21

Jeśli nie myArr=nil;przez siebie, to straciłeś wskaźnik do którego można wysłać releasewiadomość. Nie ma magii do releaseTwojego obiektu.

I, jak mówi Georg, nie będąc w stanie uwolnić swój cel, że pamięć „wyciekły”.

Odpowiedział 09/03/2009 o 17:07
źródło użytkownik

głosy
6

Można użyć właściwości i dostać prawie składnię chcesz bez wycieku pamięci.

Za pomocą tej składni, aby zadeklarować tablicę

@property (readwrite, retain) NSMutableArray *myArray;

Następnie ponownie zainicjować to tak:

[self setMyArray:[NSMutableArray array]];
Odpowiedział 09/03/2009 o 17:59
źródło użytkownik

głosy
5

Jeśli były na Mac OS, iPhone OS nie powiedziałbym, że to zależy od tego, czy śmieciarza jest aktywna czy nie:

  • GC: korzystanie myArr = nil;
  • GC: bez zastosowania [myArr release];

Niestety, na iPhone, nie ma zbieranie śmieci, więc jeśli nie chcesz wycieków pamięci, trzeba zwolnić swój przedmiot raz już nie potrzebują.

Odpowiedział 09/03/2009 o 17:13
źródło użytkownik

głosy
4

Pierwszy blok kodu jest w porządku. Jednak drugi blok nie zostawiają cię z tablicy można użyć tak nie jest wystarczające. Połowa korygowania tego bloku, myślę, że chodziło Ci o:

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

Jednak to nie osiągnąć to, co chcesz, albo dlatego, że nie wypuszczamy myarr. Jeśli syntetyzowany setter dla myarr, wtedy można uzyskać zachowanie uwalniania chcesz od ustawień do zera, przy użyciu setter (self.myArr) zamiast dostępu wskaźnik bezpośrednio (myarr). Korygowanie drugi blok w pełni:

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

Teraz mamy równoważne przykłady kodu, za pomocą jednego seter z zera do uwolnienia, a drugi nie. Oni są tacy sami.

Jeśli myarr jest zmienny tablicy, jak w tych przykładach, najbardziej skutecznym sposobem jest użycie removeAllObjects unikając całą pracę zwalniania pamięci tylko zastrz go:

[myArr removeAllObjects];
Odpowiedział 02/12/2009 o 11:08
źródło użytkownik

głosy
1

Jeśli to, co chcesz, aby przywrócić zawartość z NSMutableArray / NSMutableDictionary, można również zadzwonić removeAllObjects i masz świeże tablicy / dict pracować.

Odpowiedział 13/03/2009 o 22:37
źródło użytkownik

głosy
1

Jednym ze sposobów, aby uświadomić sobie różnicę może być to: Ustawienie odniesienie do obiektu do zera nic nie robi do obiektu, tylko robi coś do odniesienia.

„Zwolnienie obiektu” nie jest „nic”, więc nie robi. :) W języku śmieci zgromadzone może to zrobić, że jako efekt uboczny upuszczenie odniesienia, ale w Objective C to nie działa w ten sposób.

Odpowiedział 09/03/2009 o 17:09
źródło użytkownik

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