NSData subdataWithRange问​​题

时间:2009-08-14 20:50:37

标签: cocoa nsdata

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

    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)]调用之后发生...我无法理解为什么。

1 个答案:

答案 0 :(得分:3)

可能的原因是每个“copyData”实际上都引用了原始数据。因此,新数据对象将保持对原始对象的引用。这通常是效率优势,因为不需要制作实际数据的副本。 (例外情况是你计划保留一个小的子范围。)

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

通常,您不应该查看对象的保留计数。不受您直接控制的代码可以通过对象引用做任何想要的事情,只要它能够正确地平衡其保留和释放。如果您担心泄漏,请使用适当的工具,如仪器的泄漏仪器。