2011-08-25 54 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