2011-08-25 129 views
2

我注意到我的AVAssetReader(阅读器在这种情况下)retainCount继续与此代码上升。我相信我正在释放我应该做的一切。有没有办法检查CMSampleBufferRef参考计数?有没有人看到我忘记发布的东西?CMSampleBufferRef的不释放内部存储器

AVAssetReaderTrackOutput* trackOutput = (AVAssetReaderTrackOutput*)[reader.outputs objectAtIndex:0]; 
NSLog(@"PreReader Count: %d", reader.retainCount); 
CMSampleBufferRef sampleBufferRef = [trackOutput copyNextSampleBuffer]; 
NSLog(@"Reader Count: %d", reader.retainCount); //retainCount has increased by 1 
if (sampleBufferRef) { 

    CopySampleBufferToStream(sampleBufferRef, stream); 

    CMSampleBufferInvalidate(sampleBufferRef); 
    CFRelease(sampleBufferRef); //Retain count doesn't go back down, item hasn't been deleted? 
} 

以此为的CopySampleBufferToStream

void CopySampleBufferToStream(CMSampleBufferRef sampleBufferRef, cSoundStream* stream) 
{ 
    CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef); 
    size_t length = CMBlockBufferGetDataLength(blockBufferRef); 

    do 
    { 
     //... 

     OSStatus result = CMBlockBufferCopyDataBytes(blockBufferRef, startOffset, copyLength, (stream->mSrcBuffers[stream->mActiveWriteIdx].mData + stream->mSrcBuffers[stream->mActiveWriteIdx].mBufferOffset)); 

     //... 

    } while(stream->ContinueLoading() && stream->TransitionNotReady() && copyLength < length); 

} 
的重点园区

编辑:

所以,经过进一步的调试,我能够确认的是,循环退出和自动释放后游泳池被清除AVAssetReader确实下降到1的保留计数

我感动读者的释放测试在此之前该池释放...

[pool release]; 
NSLog(@"Reader Count: %d", reader.retainCount); 
[reader release]; 

,我得到的1

但是仍然记忆出现retainCount的预期结果从CMSampleBufferRefs泄漏因为FigSampleBuffer正呆在附近。以下是我在仪器发现:

enter image description here

和调用堆栈导致CMSampleBufferRef ...

enter image description here

这是我已经退出循环之后,清理了一切,然后将其重新创建为另一个AVAsset。正如我重复这个更多FigSampleBuffer出现在每个爆头。

+0

请注意,retainCount永远无法返回n 0;一个释放的对象,碰巧仍然有点可行,有时会返回1. – bbum

回答

1

请勿拨打retainCount;它是无用的。

该代码没有任何明显的错误,明智的内存管理。

真正的问题是,你有没有平衡所有保留与发布?如果是这样,你就完成了。

如果你有,你看到无限的内存增长,然后提交一个错误。


在任何给定时间的绝对retainCount是一个实现细节,该值可能反映内部实现细节的方式超出你的控制。此外,retainCount从不反映对象当前是否在自动释放池中。

的retainCount可以绝对知道的唯一时间是:

  • 你实现一个新的根类(NSObject的子类的工作,但只是巧合)
  • 你不自动释放实例不断
  • 您不会将对象传递给任何系统API
+0

retainCount如何无用?如果我分配一个对象,我应该负责清理它。了解其他对象可以引用我的对象,并且retainCount将反映这是调试内存管理的一部分。 – TurqMage

+1

retainCount是无用的,因为它没有给你一个retainCount的实际图片。使用它进行调试是非常糟糕的;而是使用仪器分配工具并告诉它在那里记录参考。然后你可以看到保留物体的真实情况。 –

+0

那么retainCount并不是我的第一次尝试,我开始看到乐器中的东西,并希望保留计数以查找我是如何泄漏的。我觉得奇怪的是CMSampleBufferRef引用了AVAssetReader,它在清理池时释放,但FigSampleBuffers保留。 – TurqMage