0

私は毎日デンタルフロスをし、運動をし、保持と解放のバランスを保つようにしています。

これが私が困惑したことです。私はivarを持っています:

NSMutabledata *_alignmentData 

およびそれに関連付けられた合成プロパティ:

// .h file
@property (nonatomic, retain) NSMutableData *alignmentData;

// .m file
@synthesize alignmentData=_alignmentData;

サーバーから非同期でデータをプルし始めます:

self.connection = 
[[[NSURLConnection alloc] initWithRequest:theRequest delegate:self] autorelease];

そして、非同期コールバックで後で使用されるデータバッファを割り当てた直後:

// This prints 0. Cool.
NSLog(@"BEFORE [_alignmentData retainCount] = %d", [_alignmentData retainCount]);

// Create a place to receive the data that will arrive asynchronously:
self.alignmentData = [NSMutableData data];

// This prints 2. Shouldn't this be 1 ?!?
NSLog(@" AFTER [_alignmentData retainCount] = %d", [_alignmentData retainCount]);

上記のself.alignmentDataの割り当て後に発生する最初の非同期コールバックの問題を複雑にするために、保持カウントを再度調べます。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

    // This prints 1. 
    NSLog(@"[_alignmentData retainCount] = %d", [_alignmentData retainCount]);
    [self.alignmentData setLength:0];

}

したがって、保持カウントが0から2に増加し、次に1に減少するように見えます。誰かがこれがどのように可能であるかを私に説明できますか?

注:デバッグの補助として保持カウントを使用しないように言われましたが、Objective-Cなどのガベージコレクションされていない言語では実際的ではありません。

4

3 に答える 3

5

メモリ管理プログラミングガイドから:

カウントを保持

通常、オブジェクトの保持カウントを明示的に尋ねる理由はありません(retainCountを参照)。どのフレームワークオブジェクトが関心のあるオブジェクトを保持しているかに気付かない可能性があるため、結果は誤解を招くことがよくあります。メモリ管理の問題をデバッグする際には、コードが所有権ルールに準拠していることを確認することだけに注意する必要があります。

オブジェクトのretainCountを照会することが有用であるという状況に遭遇したことはありません。適切なメモリ管理ルールに従えば、問題はありません。

実際の質問については、自動リリースはすぐには行われません。これらは、現在の自動解放プールがポップされるたびに発生します。自動解放プールを明示的に管理していないため、その自動解放がいつ発生するかを制御することはできません。ただし、正しいメモリ管理ルールに従っているように見えるので、心配する必要はありません。

于 2009-10-17T20:19:07.423 に答える
5

保持カウントをデバッグの補助として使用しないことは実用的です。実際、カウントの保持に注意を払わないように言うのは、経験豊富な Objective-C コーダーです。それらを一般的に心配しているのは、Objective-C を初めて使用するコーダーであり、あなたと同じように混乱してしまいます。

保持数についてはあまり気にする必要はありません。何かが予想よりも多く保持されているという事実は、必ずしもコードと関係があるとは限らず、必ずしもバグを示しているわけではありません。どちらが該当するかを判断する唯一の方法は、アドバイスされたような適切なデバッグ ツールを使用することです。そもそもする。

この特定のケースでは、2 がその時点でのそのオブジェクトの正しい保持カウントです。これは、オブジェクトが保持カウント 1 で作成され、セッター メソッドによって保持されているためです。

于 2009-10-17T20:27:02.870 に答える
3

おそらく、オブジェクトに+1のカウントと自動解放を割り当てているため、オブジェクトはプロパティに設定され、そのオブジェクトに保持を呼び出すため、+ 2になり、元のオブジェクトは自動解放されるため、+1になります。

于 2009-10-17T20:18:23.627 に答える