2

一部のオブジェクトの保持カウントをチェックしています

NSLog(@"r = %d", [aObject retainCount];

意図的に「リリース」呼び出しを追加しても、取得できる最小値は「r = 1」のようです

[aObject release];

dealloc オブジェクトのメソッドに「release」および「NSLog」テストコードを入れようとしても、「r = 1」制限は保持されます 。

Cocoa ランタイムは、サンプル プログラムの最後で (GC なしで) 「EXC_BAD_ACCESS」でクラッシュする前に、「r = 1」までの余分なリリースを無視しているようです。

私の唯一の説明 (推測) は、オブジェクトにアクセスするには r >= 1 が必要だということです。そして、Cocoa ランタイムは、オブジェクトの保持カウントが途中で 0 になるのを控えようとします。

私が間違っている場合、誰かが私を確認または修正できますか?

4

6 に答える 6

6

私はbbum(および他の人)から学んだので、を使用しないでくださいretainCount。オブジェクトの保持状態について情報を提供することを目的としたものではありません。メモリ管理プログラミングガイドを読むだけで、その実践から逸脱しないでください。retainCountメモリ管理 に使用しようとしないでください。

割り当てられたオブジェクトまたは保持されたオブジェクトを何回解放しますか?を参照してください。、

-retainCountを使用する場合

于 2011-02-07T23:10:20.143 に答える
6

オブジェクトの保持カウントが 0 に近づく (つまり、保持カウントが 1 であり、解放が再度呼び出された) 場合、わざわざ最終デクリメントを行う代わりに、オブジェクトの割り当てが解除されます。

于 2011-02-07T22:55:09.350 に答える
3

もしretainCount == 0なら、特異点が達成されています!

チキンミートエッグ。それともエッグミートチキン?

定義上、retain が 1 つ残っている状態でオブジェクトを解放することは、オブジェクトの割り当てが解除されることを意味します。その後のメソッド呼び出しは、未定義の動作を引き起こします。

于 2011-02-07T23:58:34.653 に答える
1

Instruments ツールはゾンビ検出を提供します。これは、Cocoa の参照カウントを自分でデバッグしようとするよりも効果的です。Xcode の Run > Run with Performance Tool > Zombies コマンドを使用します。リリースされたオブジェクトでメソッドを呼び出していることを検出し、オブジェクトの完全なライフサイクルの保持/リリース履歴を表示します。Apple がこのツールを追加して以来、生活はずっと良くなりました。

于 2011-02-08T03:59:55.193 に答える
0

参照カウントに基づくメモリ管理の哲学は、オブジェクトが>=1回参照されている間に存在するというものです。理論的には、 retainCount = 0は、オブジェクトが参照されなくなったことを意味します。メッセージを渡すことができる場合、オブジェクトは存在し、によって参照されたままであるため、取得できません。したがって、少なくともretainCount =1になります。[aObject retainCount] == 0;aObject

于 2011-02-07T23:10:28.783 に答える
0

オブジェクトの参照が 0 になると、このオブジェクトは「ゾンビ オブジェクト」になりますが、retainCount メッセージを送信できます。これは、Xcode がデフォルトでメモリ管理で「ゾンビ オブジェクトを有効にする」ことを行わなかったためです。つまり、Xcode はゾンビ オブジェクトをチェックしませんでした。 .

「Edit Scheme->Run->Diagnostics->Enable Zombie Objects」の「Enable Zombie Objects」にチェックを入れてXcodeにゾンビオブジェクトをチェックさせると、参照が0になったオブジェクトにメッセージを送信し続けるとエラーメッセージが表示されます。

スナップショット:

ここに画像の説明を入力

于 2015-07-31T07:52:07.673 に答える