自動解放プールが保持するオブジェクトへの強い参照または弱い参照を保持するかどうか疑問に思っています。彼らは弱いと思います。自動解放プールにオブジェクトを追加すると、すぐには解放されず、プールが空になったときに解放されますよね? つまり、参照カウント (または保持カウント) は、オブジェクトを自動解放プールに追加するときに同じままになりますか?
4 に答える
強い参照と弱い参照の話は、ガベージ コレクションされたメモリ管理環境 (参照されていても、弱いポインターが自動的に解放およびクリアされる環境) のコンテキストでは意味があります。GC を有効にすると、retain/release/autorelease のすべての呼び出しは基本的に何も実行されません (ただし、NSAutoreleasePool -drain メソッドはガベージ コレクションをトリガーします)。
この質問にiPhone関連のタグを付けており、iPhoneにはガベージコレクションがないため、通常の参照カウントについて言及していると思います。強いとは、参照されたオブジェクトの保持カウントを増やすことを意味し、弱いとはポインタ値を格納するだけです。
このautorelease
メソッドは、基本的にオブジェクトの所有権を呼び出し元のコードから現在の自動解放プールに移動します。呼び出し元のコードが release を呼び出し、プールが保持を呼び出していると考えることができます。
したがって、参照は事実上強力ですが、コードは所有権とリリースの責任を失います。release
自動解放プールが解放/ドレインされると、オブジェクトが呼び出されます。
自動解放プールの要点は、それが延期された解放であるということです。たとえば、メソッドで返されるローカル オブジェクトで autorelease を呼び出して、メソッドが返されるときにオブジェクトへの参照を失っても解放されるようにすることができます。
はい。保持カウントは同じままであり、yoはそれがそうであることを確認できます:
id obj = [[NSObject alloc]init];
NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
[obj autorelease];
NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]);
保持カウントは変わりません。基本的に、オブジェクトに対して autorelease メッセージを発行すると、開発者は所有権と解放の責任から解放されます。
これが自動解放プールの仕組みです。自動解放プールのインスタンスが作成されるたびに、スタックの一番上に追加されるため、システムは最新の自動解放プールを使用します。また、自動解放プールにオブジェクトを追加すると、スタック内の一番上の自動解放プールに追加されます。自動解放プールは基本的に、自動解放されたオブジェクトが追加される配列です。自動解放プールに追加されたすべてのオブジェクトは、その特定の自動解放プールが解放される (/ドレインされる) ときに解放されます。自動解放プールは、システムがイベントの処理を開始する前に最初に作成され、現在のイベント ループの実行が終了するまでそこに残ります。システムは、現在のイベント ループが完了したことを確認すると、そのイベント ループに関連付けられた最上位の自動解放プールを取得して解放します。