我觉得在下一个代码中有内存泄漏
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 ;
}
在每次迭代中,作为NSData类的aData将其retainCount增加1并且在[aData subdataWithRange:NSMakeRange(sO,dS)]调用之后发生...我无法理解为什么。
答案 0 :(得分:3)
可能的原因是每个“copyData”实际上都引用了原始数据。因此,新数据对象将保持对原始对象的引用。这通常是效率优势,因为不需要制作实际数据的副本。 (例外情况是你计划保留一个小的子范围。)
当弹出活动NSAutoreleasePool
时,将正确释放所有数据对象。
通常,您不应该查看对象的保留计数。不受您直接控制的代码可以通过对象引用做任何想要的事情,只要它能够正确地平衡其保留和释放。如果您担心泄漏,请使用适当的工具,如仪器的泄漏仪器。