2009-04-28 20 views
1

autoreleaseプールに保持されているオブジェクトへの強い参照または弱い参照が保持されているのだろうかと思います。私は彼らが弱いと思うだろう。自動解放プールにオブジェクトを追加すると、ただちにリリースされるのではなく、プールが空になったときに解放されます。したがって、リファレンスは弱いはずです。つまり、オブジェクトを自動解放プールに追加すると、参照カウント(または保持カウント)は同じに保たれますか?自動解放プールのオブジェクトはどのように参照されますか?

答えて

1

はい。それがそうであると、カウントが同じ続けて保持し、ヨーヨーを確認することができますすることができます:自動解放プールの

id obj = [[NSObject alloc]init]; 
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]); 
    [obj autorelease]; 
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]); 
2

全体のポイントは、それが延期リリースであるということです。たとえば、メソッドで返されるローカルオブジェクトに対してautoreleaseを呼び出すことで、メソッドが返されたときにオブジェクトへの参照が失われても解放されるようにすることができます。

6

強参照と弱参照の対話は、ガベージコレクションされたメモリ管理環境(weakポインタが自動的に解放され、参照されてもクリアされる)のコンテキストで意味があります。 GCを有効にすると、すべてのretain/release/autorelease呼び出しは基本的に何も操作しません(ただし、NSAutoreleasePool -drainメソッドはガベージコレクションをトリガーします)。

この質問にiPhone関連のタグが付いているので、iPhoneにガベージコレクションはありません。私はあなたが通常の参照カウントを参照していると仮定しています。弱い場合はポインタ値を格納するだけです。

autoreleaseメソッドは、オブジェクトの所有権を呼び出し元のコードから現在の自動解放プールに移動するため、呼び出し元コードと解放呼び出しを考えることができます。

したがって、参照は効果的ですが、コードが所有権を失い、責任を解放します。オブジェクトreleaseは、自動解放プールが解放/排水されたときに呼び出されます。

0

保持カウントは同じですが、基本的にオブジェクトに自動解放メッセージを送信すると、開発者は所有権と解放の責任を免れます。

これは自動解放プールの動作です。 自動解放プールのインスタンスが作成されるたびに、スタックの最上位に追加されるため、最新の自動解放プールがシステムによって使用されます。また、自動解放プールにオブジェクトを追加するたびに、スタック内の一番上の自動解放プールに追加されます。自動解放プールは、基本的に、自動解放されたオブジェクトが追加される配列です。 autoreleaseプールに追加されたすべてのオブジェクトは、その特定の自動解放プールが解放されたときに解放されます(/ドレイン)。自動解放プールは、システムがイベントの処理を開始する前に最初に作成され、現在のイベントループの実行が終了するまでそこに残ります。システムが現在のイベントループが完了したら、そのイベントループに関連付けられた一番上の自動解放プールを取得して解放します。 autorelease pool/drainingを解放すると、autoreleaseプール内のすべてのオブジェクトが解放されるまで、各オブジェクトがautoreleaseプールに追加され、オブジェクトにreleaseメッセージが送信されます。

関連する問題