0

我觉得在下一个代码中有内存泄漏

    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)] 调用之后......我不明白为什么。

4

1 回答 1

3

一个可能的原因是每个“copyData”实际上都在引用原始数据。因此,新数据对象将保留对原始对象的引用。这通常是一种效率优势,因为不需要复制实际数据。(如果您计划保留一个小的子范围,则例外。)

NSAutoreleasePool弹出活动时,所有数据对象都将正确释放。

一般来说,无论如何您都不应该查看对象的保留计数。不受您直接控制的代码可以对对象引用做任何它想做的事情,只要它正确地平衡了它的保留和释放。如果您担心泄漏,请使用适当的工具,例如 Instruments 的 Leaks 仪器。

于 2009-08-14T22:02:21.417 回答