私のアプリケーションのセカンダリスレッドの実行ループは以下のとおりです。ネストされた制御ループがあります。
- 外側のループは、アプリケーションの実行中実行されます
- 1つのビューが開いている間、内側のループが実行され、ビューが開いていない間、スレッドは待機します。
- 内側のループを通過する時間は短く、ほんの一瞬です。
私のコードは、自動リリースされたオブジェクトをリリースされていないプールに故意に残しませんが、OSが何をしているのかわかりません。
メインスレッドでは、cocoaは実行ループを通過するたびに自動解放プールをラップします。
この二次スレッドでは、最も近いものは内側のループを通過することだと思います。
内部自動解放プールは、内部ループを通過する各パスをラップします。
中央のプールは内部ループをラップアラウンドするため、このレベルで作成および自動解放されたオブジェクトは、アプリケーションが終了するまで保持されません。
外側のプールはランループ全体をラップします。
これらすべてのプールの作成と解放がコードの速度にどのような影響を与えているかをどのように判断できますか。
3つのプールすべてが必要か、過剰かを判断するにはどうすればよいですか?
コードと説明:
- (void)processLoop
{
NSAutoreleasePool * outerPool = [[NSAutoreleasePool alloc] init];
[processCondition lock];
//outer loop
//this loop runs until my application exits
while (![[NSThread currentThread] isCancelled])
{
NSAutoreleasePool *middlePool = [[NSAutoreleasePool alloc];
if(processGo)
{
//inner loop
//this loop runs typically for a few seconds
while (processGo && ![[NSThread currentThread] isCancelled])
{
NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc]; init];
//within inner loop
//this takes a fraction of a second
[self doSomething];
[innerPool release];
}
[self tidyThingsUp];
}
else
{
[processCondition wait];
}
[middlePool release];
}
[processCondition unlock];
[outerPool release];
}
の組み合わせ:
- 内側のwhileループ
- NSCondition * processCondition
processGo
との間YES
で切り替えるNO
スレッドをキャンセルせずに、内側のwhileループを停止および開始できます。
if (processGo == YES)
実行は内部のwhileループに入ります。
メインスレッドが設定されたとき
processGo = NO
実行は内側のwhileループを離れ
、外側のループの次のパスで整理され、実行がヒットします
[processCondition wait]
待って
メインスレッドがリセットされた場合
processGo == YES
と呼び出し
[processCondition wait]
実行は内部ループに再び入ります