自動解放されたインスタンスNSArray
が、返されたメソッドで使用される前に解放されないのはなぜですか?Objective-c:メソッドから自動解放されたオブジェクトを返す
- (NSArray *) f {
return [NSArray array];
}
- (void) g {
NSArray *a = [self f];
// do something with a
}
自動解放されたインスタンスNSArray
が、返されたメソッドで使用される前に解放されないのはなぜですか?Objective-c:メソッドから自動解放されたオブジェクトを返す
- (NSArray *) f {
return [NSArray array];
}
- (void) g {
NSArray *a = [self f];
// do something with a
}
NSArrayの自動解放されたインスタンスが、返されるメソッドで使用される前に、 が解放されないようにするにはどうすればよいですか?
スレッドごとにです。つまり、自動解放されたオブジェクトは、事実上、スレッドごとに発生するrelease
への遅延呼び出しです。
したがって、呼び出し元と呼び出し先の間にdrain
への呼び出しがない場合、自動排除されたオブジェクトがプール排除のために解放されることはありません(深刻なスレッドの愚かさは避けてください)。ケビンが言ったように、一般的に
は、プールは、非常によく指定された時間に排出される:実行ループが
•は、GCDを経由してブロックを派遣ループを通過するごとの下部にあるプールを排出します
ますプールコンテキスト内で実行されます。このコンテキストでは、「たびに排水されます」(実装の詳細)。 NSOperationQueueは、それ自体が
それを行うための責任があるしたがって、あなたの簡単な例では、コードの実行が非常に線形であり、検査によって、間の実行のそのスレッドにはドレインはあり得ない他のスレッド•同様
を振る舞います戻り値と呼び出し元での使用。
(これはretainCount
が役に立たない理由の1つであり、autorelease
によって引き起こされる「遅延リリース」の呼び出しもありません。また、スレッドごとの保持を数値化するものでもありません。 /スレッドがスレッドごとに完全に解放されている場合、あるスレッドから別のスレッドに所有権を明示的に移譲しない限り、同じスレッド上でオブジェクトを解放する必要があります。
自動ループ解除プールは、イベントループの繰り返し中に排水されます。リリースメッセージが自動リリースされたオブジェクトに送信されるようになるので、それらは依然として呼び出しメソッドで有効です。
自動リリースされたオブジェクトは、周囲のプールが排水されたときにのみ解放されます。これは舞台裏で起こる魔法のプロセスではありません。それは明確な時に起こる決定的な出来事です。一般に、制御が実行ループに戻ると、プールは排出されます。独自のネストされたプールを確立すると、そのプールがいつ排除されるかを制御します。
Nope;オートリリースプールは、イベントループを通過するたびに頻繁に頻繁に排水されるかもしれません... – bbum
質問の文脈を考えると、特に興味深い言い訳ではありません。 –
これは私がdownvoteをしなかった理由です。 OPの質問を説明しているが、それはまた、プールがどのように機能するかについてのかなり誤った認識を捨てる可能性をOPに残している。 – bbum