2011-04-23 19 views
6

Jak rozumiem, autoreleased obiekty są czyszczone po zwolnieniu autoreleased puli. Teraz pula autoreleaseu zostanie wydana pod koniec pętli uruchamiania.Koniec pętli uruchamiania - odzyskiwanie puli autorelease

Moje pytanie brzmi: jeśli w mojej klasie nie tworzę niestandardowej puli autorelease i wołam metodę autorelease na niektórych obiektach w tej klasie, w którym momencie te obiekty zostaną odzyskane? Czy "koniec pętli" oznacza "koniec aplikacji"?

Odpowiedz

20

Musisz zrozumieć pojęcie pętli rozruchowej. Pętla uruchamiania w systemie iOS czeka na zdarzenie, które następnie działa. Zdarzeniem może być użytkownik dotykający ekranu, odbierający połączenie itp.

Dla każdego takiego zdarzenia, na którym działa iOS, na początku tworzona jest nowa pula autoreleaseów nowa i opróżniana po zakończeniu przetwarzania zdarzenia. Teoretycznie może istnieć dowolna liczba zagnieżdżonych pul autorelease utworzonych przez Cocoa Touch, ale najważniejszą rzeczą, o której powinieneś wiedzieć, jest pętla zdarzeń.

Może pomoże ten schemat z Application Life Cycle.

UIKit event loop.

W pseudo-kodu, to sprowadza się do tego,

int UIApplicationMain(...) { 
    while (!shouldQuitApplication) { 
     Event *someEvent = // wait for next event; 
     NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init]; 
     // handle event 
     [myPool release]; 
    } 
} 

Są to typy zdarzeń w iOS

UIEventTypeTouches, 
UIEventTypeMotion, 
UIEventTypeRemoteControl, 

Więc po każdym dotyku, ruchu, lub zdarzenia zdalnego sterowania jest przetworzeniu basen zostanie osuszony.

0

Niezupełnie. Wyobraź sobie, że RunLoop ma "koła" :) Na początku każdego "koła" RunLoop tworzy pulę Autorelease i drenuje ją, zanim opuści "koło".

+0

Dopóki nie tworzę konkretnej puli AutoRelease dla mojego kodu, czy nie jest to tylko jedna pula w stosie na poziomie aplikacji? Jeśli w ogóle tworzę własne niestandardowe pule autorelease, to jest to zrozumiałe. Czy RunLoop również sam tworzył wiele puli autoreas- tów? – Abhinav

+0

Dobrze. Jeśli chcesz dowiedzieć się więcej o runach, możesz przeczytać tutaj: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1 O twoim pytaniu ... Nie ma sposobu, aby dowiedzieć się, ile puli autoreas będzie w stosie. Jeśli wykonasz swój kod z runloopa, a nie z wątku niestandardowego, istnieje co najmniej jeden. Podczas wykonywania kodu z niestandardowego wątku musisz utworzyć własne pule. – bealex

3

"Koniec" pętli uruchamiania oznacza koniec każdej iteracji pętli, a nie koniec aplikacji.