首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSData subdataWithRange问题

NSData subdataWithRange问题
EN

Stack Overflow用户
提问于 2009-08-14 20:50:37
回答 1查看 3.2K关注 0票数 0

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

代码语言:javascript
复制
    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)调用之后...我不明白为什么。

EN

回答 1

Stack Overflow用户

发布于 2009-08-14 22:02:21

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

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

通常,您不应该查看对象的保留计数。不在您直接控制之下的代码可以对对象引用做任何它想做的事情,只要它适当地平衡它的保留和释放。如果您担心泄漏,请使用适当的工具,如Instruments的leaks。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1280146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档