W większości przypadków tak naprawdę nie ma to znaczenia. Ponieważ -autorelease
oznacza po prostu, że obiekt zostanie zwolniony na końcu bieżącej iteracji pętli, obiekt zostanie zwolniony w dowolny sposób.
Największą korzyścią z używania -autorelease
jest to, że nie musisz martwić się o czas życia obiektu w kontekście twojej metody. Tak więc, jeśli później zdecydujesz, że chcesz zrobić coś z obiektem kilka linii po ostatnim użyciu, nie musisz się martwić o przeniesienie połączenia do -release
.
Głównym przykład podczas korzystania -release
uczyni zauważalnej różnicy vs. użyciu -autorelease
jest jeśli tworzysz dużo tymczasowych obiektów w swojej metodzie. Na przykład, rozważmy następujący sposób:
- (void)someMethod {
NSUInteger i = 0;
while (i < 100000) {
id tempObject = [[[SomeClass alloc] init] autorelease];
// Do something with tempObject
i++;
}
}
Do czasu metoda ta kończy, masz 100.000 obiektów siedzi w puli autorelease czeka być zwolniony. W zależności od klasy tempObject
może to być problemem, ale na pewno dotyczy to tylko iPhone'a z ograniczoną pamięcią. Tak więc powinieneś naprawdę używać -release
przez -autorelease
, jeśli alokujesz wiele tymczasowych obiektów. Ale dla wielu/większości zastosowań nie zauważysz żadnych poważnych różnic między tymi dwoma.
+1. autorelease powoduje dużo problemów z wydajnością (flak rzadko widziałem kopie zapasowe z liczbami w normalnym, niezbyt dużym kodzie), ale autoreasowanie również oszczędza wiele nieszczelności, gdy kod zostanie refaktoryzowany. Używam wydania częściej w procedurach niskiego poziomu, ponieważ nie wiem, czy można je nazwać dużą pętlą na wyższym poziomie. Jeśli jednak zamierzasz używać wydania, musisz natychmiast ustawić zmienną na zero, jeśli zmienna nadal będzie znajdować się w zasięgu. Nigdy nie zwalniaj obiektu, ale nadal masz na nim wskaźnik. –