0

このトピックを完全に理解したと思ったとき、私は基本に戻りました。

(たとえば)を使用して、自動解放されたオブジェクトをインスタンス化するメソッドがありますstringWithFormat

return [NSString stringWithFormat:@"what"];

次に、このメソッドを別のメソッドから呼び出し、さらに別のメソッドを呼び出すたびに、この autoreleasedNSStringを返すたびに、階層の各レベルで呼び出します。コードは正常に機能し、NSStringインスタンスは階層の各レベルで損なわれていません。

インスタンスは自動解放されるため、コール スタックの任意の時点で突然 0 になる可能性があると考えretainCountました (つまり、メソッドの 1 つが解放されたオブジェクトで動作している可能性があります)。このオブジェクトに依存できないというのは本当ですか?

編集:質問があまり明確ではなかったことを認識しています。ごめん。つまり:

Method1 ---calls--->    Method2 ---calls---> Method3 ---instantiates the string---> 
4

2 に答える 2

4

答えは、すべてのメソッド呼び出しの後に NSAutoreleasePool が排出され、実行ループに戻ることです。つまり、呼び出しスタックでは、実行ループに戻らない限り、オブジェクトは解放されません。

于 2010-09-28T20:55:29.737 に答える
1

自動解放されたオブジェクトは、それが割り当てられたフレームの下のスタック フレームでは割り当て解除されないと想定しても安全です。したがって、次のような呼び出しスタックで

method1
  method2 <== instance allocated/autoreleased here
   method3 <== safe to use here

メソッド 2 で割り当て/自動解放されたインスタンスがメソッド 3 で有効であると想定しても安全です。これは、上位フレームの自動解放プールを下位フレームで (愚かでない限り) 排出できないためです。もちろん、制御が method1 に戻ると、すべての賭けはオフになります。

下のフレームに割り当てられた自動解放プールには、メソッド 2 で自動解放されたインスタンスが含まれません。これは、自動解放時にアクティブなプールになることはできなかった (まだ作成されていなかった!) ためです。

最後に、対象のメソッドと、オブジェクト インスタンスをインスタンス化して自動解放するメソッドとのの呼び出しチェーンの下位のメソッドが自動解放プールを作成して排出しない限り、実行が終了するまで外側のプールが排出されないことが保証されます。ループ。

于 2010-09-28T21:10:07.607 に答える