2011-03-08 18 views
1

を示しています。retainCountは、私はクラスでこのコードを持っextrange行動

- (void)cancel { 
    if (_cancelBlock) 
     _cancelBlock(); 
} 
- (void)overrideCancelWithBlock:(void(^)(void))cancelBlock { 
    [_cancelBlock release]; 
    NSLog(@"AsyncOperation-overrideCancelWithBlock-[cancelBlock retainCount]=%lu (before)", [cancelBlock retainCount]); 
    _cancelBlock = [[cancelBlock copy] retain]; 
    NSLog(@"AsyncOperation-overrideCancelWithBlock-[_cancelBlock retainCount]=%lu (after)", [_cancelBlock retainCount]); 
} 

- (void)dealloc 
{ 
    NSLog(@"AsyncOperation-dealloc-[_cancelBlock retainCount]=%lu (before)", [_cancelBlock retainCount]); 
    [_cancelBlock release]; 
    NSLog(@"AsyncOperation-dealloc-[_cancelBlock retainCount]=%lu (after)", [_cancelBlock retainCount]); 
    [super dealloc]; 
} 

こののNSLog() 'sの出力を、次のとおりです。

AsyncOperation-overrideCancelWithBlock-[cancelBlock retainCount]=1 (before) 
AsyncOperation-overrideCancelWithBlock-[_cancelBlock retainCount]=1 (after) 
AsyncOperation-dealloc-[_cancelBlock retainCount]=1 (before) 
AsyncOperation-dealloc-[_cancelBlock retainCount]=1 (after) 

copyメソッドのドキュメントは述べていますこの:

特別な考慮事項

ガベージコレクションではなく、マネージメモリを使用している場合、このメソッド は、 を返す前に新しいオブジェクトを保持します。しかし、 メソッドの呼び出し側は、返されたオブジェクトを解放するのは です。

So. NSLog()の出力は常にretainCountの同じ値を表示しますか?

答えて

2

retainCountためdocumentationこれは言う:

重要:この方法は、メモリ管理の問題をデバッグする際に一般的に無価値のあります。任意の数のフレームワークオブジェクトが参照を保持するためにオブジェクトを保持していて、同時に自動解放プールがオブジェクトに任意の数の遅延リリースを保持している可能性があるため、この情報から有用な情報を得ることはほとんどありません方法。

メモリ管理の基本規則を理解するには、「メモリ管理規則」をお読みください。

LLVM/Clang Static Analyzerは、プログラムを実行する前であっても、通常、メモリ管理の問題を検出することがあります。
InstrumentsアプリケーションのObject Allocインストゥルメント(Instrumentsのユーザガイドを参照)は、オブジェクトの割り当てと破棄を追跡できます。
Shark(Shark User Guide参照)は、(プログラムの他の多くの面で)メモリ割り当てをプロファイルします。

あなたの質問に答えてください:appleだけが、この時点でのretainCountがそうである理由を知っているかもしれません。

+0

fluchtpunktが正しいです。適切なメモリ管理ガイドラインに従っている限り、心配する必要はありません。また、多くの場合、誤解を招く可能性があるため、オブジェクトの保持カウントをチェックすることは「悪い習慣」と考えられます。 –

2
_cancelBlock = [[cancelBlock copy] retain]; 

これはブロックを過度に保持します。ただコピーするだけです。


ブロックは実装の詳細に基づいて、コンパイル時に撮影したアクションと変更タイプに基づいて、実行時にフォームを変更することができますので、様々なブロッククラスは、一般的にそれがナンセンス発生器としてretainCountを扱います。場合によっては、これは常に1を返すことを意味します。

ゼロのretainCountはすべての場合で論理的に不可能であることに注意してください。

関連する問題