2011-08-17 20 views

答えて

16

deallocメッセージを直接送信することはありません。その代わりに、オブジェクトのdeallocメソッドはリリースNSObjectプロトコルメソッドを介して間接的に呼び出されます(リリースメッセージによって受信者の保持カウントが0になる場合)。これらのメソッドの使用の詳細については、「メモリ管理プログラミングガイド」を参照してください。

サブクラスは、オブジェクトによって消費される追加メモリの解放を可能にするために、deallocatedオブジェクトによって所有されているデータまたはオブジェクトインスタンス変数のための動的に割り当てられたストレージなど、

重要:アプリケーションが終了すると、プロセスのメモリはdealloc メッセージで送信されないことに注意してください。終了時に自動的にクリアされます。 オペレーティングシステムがすべてのメモリを呼び出すよりもリソースをクリーンアップできるようにするのがより効率的です。 管理方法。このおよびその他の理由により、あなたはmemory managementの結果として呼び出され のdealloc

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc]; 
    } 
    } 
1

オブジェクトが不要になったとき(実行時も同様)、ランタイムはこれを行います。あなたが正しく保持され、リリースされていることを確認してください。他のオブジェクトでdeallocを呼び出さないでください。

2

deallocで希少な資源を管理するべきではありません。オブジェクト "retainCount"が0に達すると、自動的にそのオブジェクトにデオロッコメッセージが送信されます。

オーバーライドされたdeallocの末尾にある[super dealloc];への呼び出しでない限り、オブジェクトに対してdeallocを呼び出さないでください。

-(void)dealloc 
{ 
    [ivar release]; //Release any retained variables before super dealloc 

    [super dealloc]; //Only place in your code you should ever call dealloc 
} 

そして-[NSObject dealloc] discussion

に応じてあなたは直接のdeallocメッセージを送信することはありません。その代わりに、オブジェクトの deallocメソッドがリリースNSObject プロトコルメソッド(リリースメッセージの結果、受信者の 保持カウントが0になる場合)によって間接的に呼び出されます。これらの方法の詳細については、 のMemory Management Programming Guideを参照してください。

5

-releaseは、次のようにNSObjectの中に実装されていることを想像:私はそれはそれよりもう少し複雑だと確信していますが、あなたの質問への答えは、オブジェクト自体は-deallocときに呼び出すということです

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc] 
    } 
} 

その保持カウントはゼロに低下する。ただし、カスタムクラスはNSObjectからこの動作を継承します。あなたが書くコードで-deallocを自分で呼び出す必要はありません。オブジェクトが適切に解放されると、常に自動的に発生します。

+0

私はこのメソッド本体が 'retain'ではなく 'release'の下にあることを望みます。 – Saran

+0

@ saran、あなたは絶対に正しいです。私の愚かな間違い。それをキャッチするためにありがとう。 – Caleb

+1

本当に素敵なanswer.i上記の答えを与えるが、あなたの答えは実用的な方法で最高だと思う.. – PJR

関連する問題