gpt4 book ai didi

cocoa - NSData subdataWithRange 问题

转载 作者:行者123 更新时间:2023-12-03 17:37:19 25 4
gpt4 key购买 nike

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

    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 类)将其保留计数增加 1,并且它发生在 [aData subdataWithRange: NSMakeRange(sO,dS)] 调用之后...我不明白为什么。

最佳答案

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

当事件的 NSAutoreleasePool 弹出时,所有数据对象都将被正确释放。

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

关于cocoa - NSData subdataWithRange 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1280146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com