我觉得在下一段代码中会有内存泄漏
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 ;
}在每次迭代中,aData是NSData类,它的retainCount递增1,它发生在aData subdataWithRange: NSMakeRange(sO,dS)调用之后...我不明白为什么。
发布于 2009-08-14 22:02:21
一个可能的原因是,每个“copyData”实际上都引用了原始数据。因此,新数据对象将保留对原始对象的引用。这通常是一个效率优势,因为不需要制作实际数据的副本。(例外情况是您计划保留一个较小的子范围。)
当active NSAutoreleasePool弹出时,所有数据对象都将被正确释放。
通常,您不应该查看对象的保留计数。不在您直接控制之下的代码可以对对象引用做任何它想做的事情,只要它适当地平衡它的保留和释放。如果您担心泄漏,请使用适当的工具,如Instruments的leaks。
https://stackoverflow.com/questions/1280146
复制相似问题