2012-02-21 10 views
1

ここでは基本的な質問があります。dealloc呼び出しでの混乱

オブジェクトの参照カウントが0になったときにdeallocが呼び出され、deallocがオブジェクトによって保持されているすべてのリソースを解放するか、メモリを解放するのは分かりますか?

私たちがそのオブジェクトにリリースメッセージを送信すると、オブジェクト参照カウントはゼロになりますか?

は、として作成そのプロパティを使用して、次のオブジェクトを検討します

@property (retain) NSString* myString;//reference count 1 

とのdealloc

[myString release];//reference count 0 
[super dealloc]; 

私は任意の場所のdeallocを除きmyStringオブジェクトを解放していないです。

私の質問は、myStringオブジェクト参照カウントをゼロにしてdeallocを呼び出すのは誰ですか?

疑問を明確にしてください。

+1

ARCを使用すると、retain/release/autoreleaseとdeallocが不要になります。 – zaph

+0

@Zaph:ARCは 'dealloc'を削除しません。それはあなたがそれをオーバーライドする必要がある可能性がかなり低くなりますが、それでもあなたがいる場合があります。 –

答えて

2

オブジェクトの所有権を維持するものは、それを解放する責任があります。たとえば、投稿したコードがmyStringに格納されているNSStringの所有権を維持する唯一のものである場合、リリースを呼び出すと、参照カウントが減少し、オブジェクトが割り当て解除される可能性が高くなります(文字列リテラルは異なります)。今度はmyStringを渡した場合、またはmyStringを要求したものが残っていて、それを保持している場合は、deallocメソッドで解放する前または後にコードを解放する責任もあります。

この概念を補強するためにdocumentationを参照することをおすすめします。

1

あなたのプロパティmyStringがクラスMyClass内にあるとします。あなたのクラスの各インスタンスが作成され(おそらく!)リリースされます。そのインスタンスが[解放]されると、MyClassのdeallocメソッドが呼び出されます。あなたのdeallocは、オブジェクトのスタックの 'bottom'に到達するまで、自分のdeallocを呼び出すなど、プロパティのリリースを呼び出します。

+0

'release'は必ずしも' dealloc'を返すわけではありません。 *最後の 'release'は行います。以前の 'retain'をバランスさせる' release'はそうしません。 –

+0

合意。私はそれを単純なままにしようとしました... –

0

オブジェクトは、保持/解放のペアが一致する場合にのみフリーになります。あなたがココアのメモリ管理(appleのドキュメント - メモリ管理のプログラミングガイドを進めてください) の規則に従えば、あなたはその時点で唯一の「所有者」であり、dealloc zapは最後の参照を実行しているので、オブジェクトをfreeingします。

+0

'dealloc'は"最後の参照を遠ざける "ことはありません。最後の参照を解放すると、 'dealloc'が呼び出されます。 –

+0

yup - deallocが実行されています(最後のrefはobj内のNSStringを返します) - その時点でrefを持たないNSStringオブジェクト(zap)を呼び出します。 – hburde

+0

ああ、 "zapの最後の参照"文字列に*。重要な詳細。 –

関連する問題