2009-08-14 4 views
0

i fühlen, wie Speicherverlust in dem nächsten Code mitNSData subdataWithRange Frage

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 ; 
    } 

in jeder Iteration ADATA die NSData Klasse erhöht seine RetainCount von 1 ist, und es happenes nach [ADATA subdataWithRange: NSMakeRange (sO, Ds) ] Anruf ... ich kann nicht verstehen warum.

Antwort

3

Ein wahrscheinlicher Grund ist, dass jedes "copyData" tatsächlich die Daten im Original referenziert. Daher behalten die neuen Datenobjekte einen Verweis auf das ursprüngliche Objekt. Dies ist im Allgemeinen ein Effizienzvorteil, da keine Kopie der tatsächlichen Daten gemacht werden muss. (Die Ausnahme wäre, wenn Sie planen, einen kleinen Teilbereich herum zu halten.)

Alle Datenobjekte werden ordnungsgemäß freigegeben, wenn der aktive NSAutoreleasePool aufgerufen wird.

Im Allgemeinen sollten Sie die Anzahl der Retouren von Objekten sowieso nicht untersuchen. Code, der nicht unter Ihrer direkten Kontrolle steht, kann mit Objektreferenzen genau das tun, was er will, solange er seine Retentionen und Releases richtig ausbalanciert. Wenn Sie über Lecks besorgt sind, verwenden Sie geeignete Werkzeuge wie das Instrument "Leaks".

+0

"so lange, wie es sich ausgleicht, behält und freigibt" Und es ist erwähnenswert, dass 'autorelease' als" richtig "gilt, aber nicht sofort in' retainCount' auftaucht. '[[[[[[[foo behalten] Autorelease] behalten] Autorelease] behalten] Autorelease] behalten] Autorelease] retainCount]' ist 4. –

+1

Nun, ich sollte sagen, was auch immer es war plus 4. –