2009-08-14 9 views
0

iはNSDataのクラスが1で、そのretainCountを増加であり、それは[A-DATA subdataWithRange後happenes各反復ADATAに次コードのNSData subdataWithRange質問

while([outData length] + ptr[currentPacket].mDataByteSize < inBytesToGet && currentPacket < packetsCount) 
    { 
     NSLog(@" ++> %d", [aData retainCount]) ; 
     NSInteger sO = ptr[currentPacket].mStartOffset ; 
     NSInteger dS = ptr[currentPacket].mDataByteSize ; 
     NSLog(@"  get: cP: %d tP: %d mStartOffset: %d mDataByteSize: %d", currentPacket, packetsCount, sO, dS) ; 
     NSData *copyRange = [aData subdataWithRange: NSMakeRange(sO,dS)] ; 
     NSLog(@" => %d", [aData retainCount]) ; 
     [outData appendData:copyRange] ; 
     ptr[currentPacket].mStartOffset = bytesFilled + inOffset ; 
     [outPackets appendBytes: &ptr[currentPacket] length: sizeof(AudioStreamPacketDescription)] ; 
     currentPacket++ ; 
     bytesFilled += dS ; 
    } 

にメモリリークを有するように感じます]コール...なぜ私は理解できません。

答えて

3

おそらく、それぞれの「copyData」が実際に元のデータを参照している可能性があります。したがって、新しいデータオブジェクトは元のオブジェクトへの参照を保持します。これは、実際のデータのコピーを作成する必要がないため、一般的に効率の利点です。

アクティブなNSAutoreleasePoolがポップされると、すべてのデータオブジェクトが適切に解放されます(ただし、小さなサブレンジを維持する予定がある場合は例外です)。

一般に、とにかくオブジェクトの保持数を調べるべきではありません。あなたの直接の管理下にないコードは、オブジェクトの参照が保持され、適切に解放される限り、オブジェクト参照で必要なことを何でも実行できます。漏れが心配な場合は、Instruments's Leaks instrumentなどの適切なツールを使用してください。

+0

「保持と解放のバランスが取れていれば」「autorelease」は「正常」とカウントされますが、すぐに「retainCount」には表示されません。 autorelease] retain] autorelease] retain] autorelease] retainCount] 'は4です。 –

+1

これは、前に何があったのかを4で表します。 –