2009-04-07 8 views
7

私は違いを知っていると思うが、それを正しく説明する方法はわからない。[myVar dealloc]と[myVar release]の相違点は何ですか?

deallocは、その変数によって予約されているメモリを完全かつ即座に削除します。

リリースでは、変数のメモリの保持カウンタが-1減少します。 1だった場合は0なので、その時点でdeallocと同じ効果があります。

そうですか?またはより良い短い説明はありますか?

答えて

13

これはまさに正しいことです。

オブジェクトを使用する場合は、保持カウントがわからないため、deallocは使用しません。あなたも気にしません。 releaseに電話することで、あなたはそれがもう必要ないと言うだけです。そして誰もいなくなると、オブジェクトはdeallocを呼び出します。

7

すべてが正しいですが、あなたが欠けている重要なポイントは、決して自分自身でdeallocを呼び出すべきではないということです。ここではNSObjectのdeallocメソッドで、Appleのドキュメントからいくつかの情報です:

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/deallocから)

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

サブクラスは、オブジェクト、データ 又は 割り当て解除オブジェクトが所有するオブジェクトインスタンス変数の 動的に割り当てられたストレージなどで消費される追加のメモリ の 放出を可能にするためのdeallocの独自 バージョンを実装する必要があります。

+0

おかげ: クラス固有 割り当て解除を行った後、サブクラス方法 は、スーパークラスバージョンスーパーへのメッセージを介してのdeallocの を組み込むべきです。私は今、ちょっと混乱していると思います...サブクラスのdeallocメソッドの内部では、インスタンス変数をdeallocする必要がありますか?すなわち、 - (void)dealloc { \t [yellowViewController dealloc]; \t [blueViewController dealloc]; [super dealloc]; } – Thanks

+0

明確にするために、スーパー以外のものでは決してdeallocを呼び出してはいけません。 Thanks 'deallocメソッドの適切な実装は次のとおりです。 - (void)dealloc {[yellowViewController release]; [blueViewController release]; [super dealloc]; } – rpetrich

+0

私はあなたが読んでいるのを見ています。iPhone 3の開発の開始 - SDKの探究(私も黄色/青のビューコントローラプロジェクトを認識しました)。 – mk12

関連する問題