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.
Albo http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –