2011-04-23 24 views
6

私が理解するように、自動リリースされたオブジェクトは、自動リリースされたプールが解放されるときれいになります。これで、オートループプールは実行ループの最後に解放されます。実行ループの最後 - 自動解放プールの回復

私のクラスでカスタム自動解放プールを作成せず、そのクラスのいくつかのオブジェクトでautoreleaseメソッドを呼び出すのではない場合、それらのオブジェクトはいつ回復されますか? 「実行ループの終わり」は「アプリケーションの終了」を意味しますか?

答えて

20

実行ループの概念を理解する必要があります。 iOSの実行ループは、何らかのイベントが発生するのを待ってから、それを実行します。そのイベントは、ユーザーが画面に触れたり、電話を受けるなどの場合があります。

iOSが処理するすべてのイベントでは、新しい自動解放プールが最初に作成され、イベント処理が完了すると排水されます。理論的には、Cocoa Touchによって作成された入れ子になったオートレリープールがいくつでもありますが、あなたが知っておくべき主なものはイベントループです。

おそらく、Application Life Cycleのこの図が役に立ちます。

UIKit event loop

擬似コードで

、これはつまるところ、

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

これらは、だから、すべてのタッチ、モーション、またはリモコンの後にイベントが処理されるのiOS

UIEventTypeTouches, 
UIEventTypeMotion, 
UIEventTypeRemoteControl, 

のイベントタイプですプールは排水される。

0

RunLoopに "circle"があるとしましょう:)すべての "circle"の始まりで、RunLoopはAutoreleaseプールを作成し、 "Circle"を終了する前に排水します。

+0

私のコード用に特定のAutoReleaseプールを作成していない限り、アプリケーションレベルでスタックにプールが1つしかありませんか?まったく自分のカスタムオートリリースプールを作成している場合、これは理解できます。 RunLoopは複数の自動解放プールも独自に作成しましたか? – Abhinav

+0

。 runloopsについて詳しく知りたい場合は、こちらを参照してください:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1あなた​​の質問について...そこにオートリアーゼプールがいくつあるか知る方法はありません。カスタムスレッドからではなく、runloopからコードを実行する場合、少なくとも1つはあります。カスタムメイドスレッドからコードを実行するときは、独自のプールを作成する必要があります。 – bealex

3

実行ループの「終了」とは、アプリケーションの終了ではなく、実行ループの各反復の終了を意味します。

関連する問題