【问题标题】:CMSampleBufferRef memory leakCMSampleBufferRef 内存泄漏
【发布时间】:2012-03-10 10:36:40
【问题描述】:

所以我在转换一些音频时遇到了问题。我在转换时遇到了巨大的内存泄漏,它来自这些代码行。

dispatch_queue_t mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL);
[assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue 
                                        usingBlock: ^ 
 {

     while (assetWriterInput.readyForMoreMediaData) 
     {
         CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];
         if (nextBuffer) 
         {

             [assetWriterInput appendSampleBuffer: nextBuffer];
              nextBuffer = NULL;              

         } 
         else 
         {
             // done!
             [assetWriterInput markAsFinished];
             [assetWriter finishWriting];
             [assetReader cancelReading];
             NSDictionary *outputFileAttributes = [[NSFileManager defaultManager]
                                                   attributesOfItemAtPath:exportPath
                                                   error:nil];





             NSNumber *doneFileSize = [NSNumber numberWithLong:[outputFileAttributes fileSize]];
             [self performSelectorOnMainThread:@selector(updateCompletedSizeLabel:)
                                    withObject:doneFileSize
                                 waitUntilDone:NO];

             // release a lot of stuff
             [assetReader release];
             [assetReaderOutput release];
             [assetWriter release];
             [assetWriterInput release];
             [exportPath release];
             break;
         }
     }

 }];

似乎导致泄漏的行是: CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];

我在这方面迷路了,任何帮助将不胜感激。

回答: 已修复 - 只需在 if/else 语句的末尾添加这些行。

CMSampleBufferInvalidate(nextBuffer);
         CFRelease(nextBuffer);
         nextBuffer = nil; // NULL?

【问题讨论】:

    标签: iphone ios memory-management memory-leaks


    【解决方案1】:

    回答:已修复 - 只需在 if/else 语句的末尾添加这些行。

    CMSampleBufferInvalidate(nextBuffer);
    CFRelease(nextBuffer);
    nextBuffer = NULL;
    

    【讨论】:

    • 你为什么在CFRelease之前调用CMSampleBufferInvalidate
    • @Meekohi 可能不需要这个确切的顺序,很久以前就这样做了,但不确定,我知道组合完成了这项工作。
    • 在样本缓冲区上调用 CFRelease 会导致我崩溃,即使在没有 CMSampleBufferInvalidate 和 sampleBuffer = NULL 的情况下使用它也是如此。我建议只使用 CMSampleBufferInvalidate(nextBuffer); nextBuffer = NULL;
    • 是否需要 = nil/null?它会做额外的发布,还是只是为了代码的清晰/整洁?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    • 2013-06-24
    • 2011-03-22
    • 2015-04-20
    相关资源
    最近更新 更多