回答:
を使用-retainCount
することはできません。何も役に立たないからです。FoundationおよびAppKit / UIKitフレームワークの実装は不透明です。何が保持されているのか、なぜ保持されているのか、誰が保持しているのか、いつ保持されているのかなどはわかりません。
例えば:
[NSNumber numberWithInt:1]
あると思うでしょうretainCount
。それはありません。2です。@"Foo"
あると思うでしょうretainCount
。それはありません。1152921504606846975です。[NSString stringWithString:@"Foo"]
あると思うでしょうretainCount
。それはありません。ここでも、1152921504606846975です。基本的に、何でもオブジェクトを保持できる(したがって、オブジェクトを変更できるretainCount
)ため、およびアプリケーションを実行するほとんどのコードのソースがないため、オブジェクトのretainCount
意味はありません。
オブジェクトが割り当て解除されない理由を追跡する場合は、InstrumentsのLeaksツールを使用します。オブジェクトの割り当て解除が早すぎる理由を追跡する場合は、InstrumentsのZombiesツールを使用します。
ただし、は使用しないでください-retainCount
。それは本当に価値のない方法です。
編集する
誰もがhttp://bugreport.apple.comにアクセスして-retainCount
、廃止予定をリクエストしてください。それを求める人が多いほど良い。
編集#2
更新として、9223372036854775807 [NSNumber numberWithInt:1]
のretainCount
が追加されました。コードが2であると予期していた場合、コードは壊れています。
- (NSUInteger)retainCount{return NSUIntegerMax;}
。
retainCount
。
-retainCount
Instrumentsとそのツールから(より詳細に)取得できる情報を取得できます。
retain
、retain
、retain
、autorelease,
自動解放は、autorelease
例えば、UIKitのAPIを使用してオブジェクトを渡すの完全に有効な結果である可能性があります。
自動解放されたオブジェクトは、-retainCountのチェックが有益ではなく、誤解を招く可能性がある1つのケースです。保持カウントは、オブジェクトに対して-autoreleaseが呼び出された回数については何も通知しないため、現在の自動解放プールが空になったときにオブジェクトが解放される回数を示します。
NSObjectに関するAppleのドキュメントを見てください。それはあなたの質問をほとんどカバーしています: NSObject maintainCount
要するに、独自の参照カウントシステムを実装していない限り、retainCountはおそらく役に立たないでしょう(私はあなたがそうしないことをほぼ保証できます)。
Apple自身の言葉で言えば、retainCountは「通常、メモリ管理の問題をデバッグすることに意味はありません」。
もちろん、retainCountメソッドをコードで使用しないでください。その値の意味は、オブジェクトに適用されている自動解放の数によって異なり、予測できないためです。ただし、デバッグには非常に役立ちます。特に、メインイベントループの外側でAppkitオブジェクトのメソッドを呼び出すコードでメモリリークを追跡する場合に役立ちます。非推奨にしないでください。
あなたの主張をするあなたの努力において、あなたは価値の不可分の性質を真剣に誇張しました。常に参照カウントであるとは限りません。フラグに使用される特別な値がいくつかあります。たとえば、オブジェクトの割り当てを解除してはならないことを示します。1152921504606846975のような数値は、16進数で書き込んで0xfffffffffffffffを取得するまで、非常に不思議に見えます。また、9223372036854775807は16進数で0x7fffffffffffffffです。そして、retainCountを1秒あたり100,000,000回インクリメントすると仮定すると、retainCountがより大きな数と同じになるまでにほぼ3000年かかることを考えると、誰かがこれらの値をフラグとして使用することを選択することはそれほど驚くべきことではありません。
あなたはそれを使うことからどんな問題を得ることができますか?オブジェクトの保持カウントを返すだけです。私はそれを一度も電話したことがなく、私がそうする理由を考えることができません。シングルトンでオーバーライドして、割り当てが解除されないようにしました。
retainCount
、メモリ管理に使用するコードパスがありません。
アプリが稼働して有用な何かを実行するまで、メモリリークを心配する必要はありません。
それが終わったら、Instrumentsを起動してアプリを使用し、メモリリークが本当に発生するかどうかを確認します。ほとんどの場合、自分でオブジェクトを作成し(したがって、それを所有している)、完了後にオブジェクトを解放するのを忘れていました。
コードを書いているときにコードを最適化しようとしないでください。実際にアプリを実際に使用する場合、メモリリークや時間がかかりすぎると思われることがよくあります。
たとえば、allocなどを使用してオブジェクトを作成する場合は、適切なコードをリリースしてください。
-retainCount
。