2010-09-07 17 views
8

Rozważmy następujący program:Dlaczego warto używać NSAutoreleasePool?

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // Insert code here... 
    NSLog(@"Programming is Fun !"); 
    [pool drain]; 
    return 0; 
} 

ja nie rozumiem, dlaczego pool potrzebna jest tam ten sam program może być również zapisane jako to:

int main (int argc, const char * argv[]) { 
    NSLog(@"Programming is Fun !"); 
    return 0; 
} 

Jaki jest cel stosowania auto pula uwolnienia? Dlaczego i kiedy ich potrzebujemy? Czy są one obowiązkowe w każdym celu programu C?

Jeśli nie chcę automatycznie zwolnić żadnego obiektu, czy muszę również korzystać z puli Automatyczna publikacja?

Odpowiedz

7

ale jeśli nie chcesz automatycznego uwolnienia dowolny obiekt, a następnie również muszę użyć Auto basen wydania ??

Należy również zauważyć, że biblioteka Cocoa wykorzystuje autorelease szeroko. Tak więc, nawet jeśli uważasz, że nie używasz puli w kodzie, musisz przygotować pulę.

5

NSObject zawiera funkcję o nazwie autorelease schludny. Oznacza to, że wszystkie obiekty w Objective-C zawierają tę funkcję. Ta funkcja wstawia self do puli autorelease, opóźniając wywołanie funkcji obiektu release, dopóki pula autorelease nie zostanie zwolniona. Większość wewnętrznych API korzysta z puli autorelease, a obok tego, który znajduje się w main(), w każdym przejściu jest jeden przydzielony i zwolniony w głównej pętli UIKit.

W skrócie: jest to kolejka opóźnionego zmniejszenia licznika referencyjnego.

Przykład gdzie autorelease jest ukryta:

[NSString stringWithUTF8String:"some string"]; 

Ten obiekt jest przydzielona i autorelease nazywa się na nim. Jak wykorzystasz to sam?

MyObject *obj = [[[MyClass alloc] init] autorelease]; 

Dlaczego to jest dobre? Po zwróceniu tego obiektu funkcja wywołująca nie musi dbać o zwolnienie tego obiektu i opcjonalnie może go zachować (ale nie musi).


Aby rozwinąć i wyjaśnić cztery lata później:

Podczas UIKit i zestaw klas AppKit tworzyć i spuścić się NSAutoreleasePool trakcie ich głównym runloop, w programie non-GUI trzeba go utworzyć samodzielnie. Różne kody oczekują, że będą obecne w postaci NSAutoreleasePool, a ponieważ nie zainicjowałeś interfejsu GUI, ani go nie używasz, nie ma kodu, który magicznie go utworzy.

Podczas NSLog() i stałej NSString W przykładzie nie wymagają basen, nawet trywialne [NSMutableArray array] nie, biorąc pod uwagę, że może rzeczywiście być interpretowane jako [[[NSMutableArray alloc] init] autorelease].

0

Znalazłem przyczynę ... "Jeśli pula nie jest dostępna, autorejestrowane obiekty nie zostaną zwolnione, a Ty wyciekniesz pamięć W takiej sytuacji twój program będzie zazwyczaj rejestrował odpowiednie komunikaty ostrzegawcze."

+0

Jeśli znajdziesz inną odpowiedź, która jest szczególnie pomocna, możesz ją "up" i/lub oznaczyć jako poprawną. –

0

Zwykle nie musisz sam tworzyć bloku puli autoreas, ani nawet kodu, który jest używany do jego utworzenia. trzy razy, kiedy możesz użyć własnych bloków puli autorelease,

  • Jeśli piszesz program, który nie jest oparty na strukturze interfejsu użytkownika, , na przykład narzędzie wiersza polecenia.

  • Jeśli napisać pętlę, która tworzy wiele obiektów tymczasowych - Można użyć basen blok autorelease wewnątrz pętli do dysponowania tymi obiektami przed następnej iteracji. Użycie bloku puli autorelease w pętli pomaga zmniejszyć maksymalny rozmiar pamięci aplikacji.

  • Jeśli spawnujesz wątek dodatkowy - musisz utworzyć własny blok puli autorelease zaraz po rozpoczęciu wykonywania wątku; w przeciwnym razie Twoja aplikacja spowoduje wyciek obiektów.

Powiązane problemy