オブジェクトが自動解放された回数を知りたいです。オブジェクトが自動解放されたかどうかを知るのは一般的に簡単なほど十分長い間客観的 c を使用してきましたが、メモリと保持カウントを扱う質問を常に目にします。ある時点で、答えは常に「オブジェクトのretainCountを信頼することはできません」で終わります-これには同意しますが、オブジェクトが自動解放された回数を判断できれば、追加した場合、retainCountを実際に信頼できます次のようなカテゴリ:
@interface NSObject (NSObject_MemoryDebugging)
- (NSUInteger) autoReleaseCount;
- (NSUInteger) retainCountWithAutoRelease;
@end
@implementation]
/** Determine how many times this object has been marked for autorelease **/
- (NSUInteger) autoReleaseCount;
{
// ??? not sure how to figure this out.
return 0;
}
- (NSUInteger) retainCountWithAutoRelease
{
NSUInteger retainCount = [self retainCount];
NSUInteger autoReleaseCount = [self getAutoReleaseCount]; // ???
return retainCount - autoReleaseCount;
}
@end
通常、コピー中に保持カウントが増加するため、不変型の例外は依然としてあります。
私が提案していないこと
プロダクションコードでretainCountを使用するためにこの答えを求めているわけではありません。ただし、これはメモリの問題をデバッグする人にとっては価値があると思います。
プログラマーはオブジェクトが自動解放された回数を気にするべきではないので、この質問を嫌う人もいると思います。コーディングは、割り当て、保持、コピー、リリースに伴う新規作成、ストーリーの終わりのバランスをとることがすべてであるべきです。ただし、これのポイントは、人々が頭を叩くのを助けることです。 [NSObject retainCount]
多くの人を燃やします、そしてこの質問への答えはかなりクールです.
オブジェクトが自動解放された回数を判断する方法があると確信しています。私はそれが何であるかわからないので、質問です。
同様の質問を参照してください: Objective-c の NSAutoreleasePool 内のオブジェクト。
編集
皆様、ご回答ありがとうございます。これは面白いと思うかもしれません => Ariel は、GNUStep の Cocoa の実装、具体的には NSAutoReleasePool に+(NSUInteger)autoreleaseCountForObject:(id)anObject というメソッドがあることを指摘しました。このメソッドは遅く、呼び出し元のスレッドの NSAutoReleasePools からの自動解放カウントのみを返します。それでも...そこにあるのは興味深いです。ドキュメントは、実際にはデバッグにのみ役立つと述べています。これは、私が Cocoa フレームワークで何らかの方法で見つけたい (または可能性を見つけたい) ことです。
自動解放カウントを取得できたとしても、より優れたツール (ゾンビ、リーク、静的アナライザー) が存在するという回答に同意します。