私は毎日デンタルフロスをし、運動をし、保持と解放のバランスを保つようにしています。
これが私が困惑したことです。私は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などのガベージコレクションされていない言語では実際的ではありません。