2011-09-21 73 views
0

我已經將NSOperation子類化並在需要時將它的實例添加到NSOperationQue中。 在NSOperation的主要功能中,我創建一個AudioBufferList,然後在完成時釋放它。在NSOperation中釋放對象

在樂器的內存分配部分,它顯示了這些AudioBufferLists的實例在不斷攀升。字節的生存數量不斷攀升,緩衝區的mdata部分似乎是罪魁禍首。

這是我的一段代碼。

我是否正確地發佈我的緩衝區列表或者儀器可能報告不正確?

-(void)main 

{ 
//autorelase stuff in here 



     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 


    AudioBufferList *bufferList; 

      bufferList = (AudioBufferList *) malloc (
                sizeof (AudioBufferList) + sizeof (AudioBuffer) * (1) 
                ); 

      if (NULL == bufferList) {NSLog (@"*** malloc failure for allocating bufferList memory"); return;} 

      // initialize the mNumberBuffers member 
      bufferList->mNumberBuffers = 2; 

      // initialize the mBuffers member to 0 
      AudioBuffer emptyBuffer = {0}; 
      size_t arrayIndex; 
      for (arrayIndex = 0; arrayIndex < 2; arrayIndex++) { 
       bufferList->mBuffers[arrayIndex] = emptyBuffer; 
      } 

      // set up the AudioBuffer structs in the buffer list 
      bufferList->mBuffers[0].mNumberChannels = 1; 
      bufferList->mBuffers[0].mDataByteSize = numberofframestoread * sizeof (AudioUnitSampleType); 
      bufferList->mBuffers[0].mData   = (AudioUnitSampleType*)calloc(numberofframestoread, sizeof(AudioUnitSampleType)); 

      if (2 == 2) { 
       bufferList->mBuffers[1].mNumberChannels = 1; 
       bufferList->mBuffers[1].mDataByteSize = numberofframestoread * sizeof (AudioUnitSampleType); 
       bufferList->mBuffers[1].mData   = (AudioUnitSampleType*)calloc(numberofframestoread, sizeof(AudioUnitSampleType)); 

      } 


      AudioUnitSampleType *inSamplesChannelLeft=bufferList->mBuffers[0].mData; 
      AudioUnitSampleType *inSamplesChannelRight=bufferList->mBuffers[1].mData; 


// do stuff with buffer here 

free(bufferList); 

bufferlist=nil; 

[pool release] 

} 
+0

'*(2 - 1)'?當你返回'NULL == bufferList'時,你也泄漏了一個自動釋放池。你應該發佈你的結構聲明。 – Joe

+0

斑點。另外,你指的是什麼結構聲明? – dubbeat

回答

1

mData是罪魁禍首,一定要釋放那些,以及因爲你分配他們作爲釋放calloc。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

const size_t nBuffers = 2; 
AudioBufferList *bufferList; 

bufferList = (AudioBufferList *) malloc (
             sizeof (AudioBufferList) + sizeof (AudioBuffer) * (nBuffers - 1) 
             ); 

if (NULL == bufferList) {NSLog (@"*** malloc failure for allocating bufferList memory"); [pool drain]; return;} 
// initialize the mNumberBuffers member 
bufferList->mNumberBuffers = nBuffers; 

//... 
bufferList->mBuffers[0].mData   = (AudioUnitSampleType*)calloc(numberofframestoread, sizeof(AudioUnitSampleType)); 
//... 
bufferList->mBuffers[1].mData   = (AudioUnitSampleType*)calloc(numberofframestoread, sizeof(AudioUnitSampleType)); 
//... 

//Free mData here 
for(size_t i = 0; i < nBuffers; i++) 
    free(bufferList->mBuffers[i].mData); 
free(bufferList); 
[pool drain]; 
+0

好吧,我明白了。如果我只是malloc'd他們會足夠只是在緩衝區列表上單獨調用,如果是的話,爲什麼? – dubbeat

+0

任何調用分配內存的調用'calloc' /'malloc' /'valloc'都需要調用'free',所以在這種情況下,您總是需要遍歷緩衝區的數量並釋放所有的'mData' – Joe

+0

歡呼聲謝謝。在這種情況下,Mixerhost示例項目也會泄漏其緩衝區列表,因爲它只釋放緩衝區列表而不釋放其mData成員 – dubbeat