2012-02-20 68 views
7

Vì vậy, tôi đang gặp sự cố khi chuyển đổi một số âm thanh. Tôi nhận được một rò rỉ bộ nhớ rất lớn khi chuyển đổi và nó đến từ những dòng mã.CMSampleBufferRef rò rỉ bộ nhớ

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; 
     } 
    } 

}]; 

Dòng điều đó dường như gây ra rò rỉ là: CMSampleBufferRef nextBuffer = [assetReaderOutput copyNextSampleBuffer];

Tôi bị mất trên trợ giúp này sẽ được đánh giá cao.

TRẢ LỜI: Đã sửa lỗi - Chỉ cần thêm các dòng này vào cuối câu lệnh if/else.

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

Trả lời

12

ĐÁP: Cố định - Chỉ cần thêm những dòng này vào cuối câu lệnh if/else.

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

Tại sao bạn gọi 'CMSampleBufferInvalidate' trước' CFRelease'? – Meekohi

+0

@Meekohi có thể không có nhu cầu cho thứ tự chính xác này, đã làm điều này cùng thời gian trước và không chắc chắn, tôi biết rằng combo đã làm công việc mặc dù. – Krzemienski

+1

Gọi CFRelease trên bộ đệm mẫu gây ra sự cố cho tôi ngay cả khi nó được sử dụng mà không có CMSampleBufferInvalidate và sampleBuffer = NULL. Tôi khuyên bạn chỉ nên sử dụng CMSampleBufferInvalidate (nextBuffer); nextBuffer = NULL; – Zigglzworth