2013-02-03 13 views
45

Powiel możliwe:
Why use Autorelease pool?Co to jest autooddzielanie?

Wszystko Objective-C stronę wyjścia otwiera domyślną @autoreleasepool{...} oświadczenie pod głównym deklaracji funkcji. Ale co tak naprawdę robi to stwierdzenie? Nowy Objective-C zwalnia automatycznie obiekty i usunięcie linii nic nie zmienia w programie. Czy to polecenie jest naprawdę konieczne?

+0

Albo http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –

Odpowiedz

71

Instrukcja @autoreleasepool wykonuje tę samą pracę co poprzednio, zamiast używać klasy NSAutoreleasePool. Sposób działania NSAutoreleasePool był nieco dziwny, ponieważ tworzenie go powodowało efekt w całej aplikacji; @autoreleasepool tworzy obszar o określonym zakresie i sprawia, że ​​staje się on bardziej przejrzysty, co znajduje się w puli i kiedy drenuje (gdy wykracza poza zakres). Jest także bardziej wydajny według Apple.

Pojęcie puli autorelease jest prosta, gdy instancja obiektu jest oznaczony jako autoreleased (np NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];), to będzie miał liczyć zatrzymywania +1 w tym momencie w czasie, ale na koniec pętli biegu , basen jest spuszczany, a każdy obiekt oznaczony jako autoreasaż ma zmniejszoną liczbę zatrzymań. Jest to sposób na zachowanie obiektu podczas przygotowywania tego, co zachowa dla siebie.

Z ARC, podczas gdy słowo kluczowe autorelease nie jest używane przez programistę, system bazowy, który zarządza ARC, wstawia go dla Ciebie. (Pamiętaj: Wszystko, co robi ARC, to wstawianie w odpowiednich momentach połączeń retain, release i autorelease). Z tego powodu istniejąca koncepcja AutoreleasePool musi pozostać w pobliżu.

Jeśli usuniesz autorelease basen, obiektami zacznie przecieka

W środowisku zliczane odniesienia, kakao spodziewa się basen autorelease zawsze dostępny. Jeśli pula nie jest dostępna, autorejestrowane obiekty nie zostaną zwolnione, a pamięć zostanie przecięta. W takiej sytuacji twój program będzie zazwyczaj rejestrował odpowiednie komunikaty ostrzegawcze.

+0

Czy to oznacza, że ​​jeśli Używam ARC i wypuszczam obiekt skądś poza '' @autoreleasepool {} '' obiekt nadal istnieje do końca bloku @autoreleasepool? – confile

+2

Jeśli ręcznie zwolnisz obiekt autoreleased, po dotarciu do końca puli autorelease obiekt dealloc'd nie będzie już istnieć i trafisz wyjątek prawdopodobnie w strukturze lub kodzie maszynowym. Jeśli jest to długa droga kodu, Twoja aplikacja może się zawiesić w pozornie niezwiązanym miejscu, powodując zamieszanie. – jcpennypincher