Objective c 在NSO操作中释放对象

Objective c 在NSO操作中释放对象,objective-c,memory-management,Objective C,Memory Management,我已将NSOperation子类化,并在需要时将其实例添加到NSOperationQue中。 在NSOperation的主要功能中,我创建了一个AudioBufferList,然后在完成后释放它 在仪器的内存分配部分显示,这些音频缓冲列表的实例在不断攀升。有效字节数不断攀升,缓冲区的mdata部分似乎是罪魁祸首 这是我代码的一部分 我是否正确地释放了缓冲列表,或者仪器是否报告错误 -(void)main { //autorelase stuff in here NSAut

我已将NSOperation子类化,并在需要时将其实例添加到NSOperationQue中。 在NSOperation的主要功能中,我创建了一个AudioBufferList,然后在完成后释放它

在仪器的内存分配部分显示,这些音频缓冲列表的实例在不断攀升。有效字节数不断攀升,缓冲区的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]

}
-(void)主
{
//这里有自动弹射装置
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
音频缓冲列表*缓冲列表;
bufferList=(AudioBufferList*)malloc(
sizeof(音频缓冲列表)+sizeof(音频缓冲)*(1)
);
if(NULL==bufferList){NSLog(@“***malloc分配bufferList内存失败”);return;}
//初始化mNumberBuffers成员
bufferList->mNumberBuffers=2;
//将mBuffers成员初始化为0
音频缓冲区清空缓冲区={0};
大小和排列索引;
对于(arrayIndex=0;arrayIndex<2;arrayIndex++){
bufferList->mbuffer[arrayIndex]=emptyBuffer;
}
//在缓冲区列表中设置AudioBuffer结构
bufferList->mbuffer[0]。mNumberChannels=1;
bufferList->Mbuffer[0].mDataByteSize=numberofframestoread*sizeof(AudioUnitSampleType);
bufferList->mbuffer[0].mData=(AudioUnitSampleType*)calloc(numberofframestoread,sizeof(AudioUnitSampleType));
如果(2==2){
bufferList->mBuffers[1].mNumberChannels=1;
bufferList->mbuffer[1].mDataByteSize=numberofframestoread*sizeof(AudioUnitSampleType);
bufferList->mbuffer[1].mData=(AudioUnitSampleType*)calloc(numberofframestoread,sizeof(AudioUnitSampleType));
}
AudioUnitSampleType*InSampleChannelLeft=bufferList->Mbuffer[0].mData;
AudioUnitSampleType*InSampleChannelRight=bufferList->Mbuffer[1].mData;
//在这里使用缓冲区
免费(缓冲列表);
bufferlist=nil;
[池释放]
}

您的
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];
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];
常数大小n缓冲=2;
音频缓冲列表*缓冲列表;
bufferList=(AudioBufferList*)malloc(
sizeof(音频缓冲列表)+sizeof(音频缓冲)*(nBuffers-1)
);
if(NULL==bufferList){NSLog(@“***malloc分配bufferList内存失败”);[pool drain];return;}
//初始化mNumberBuffers成员
bufferList->mNumberBuffers=nBuffers;
//...
bufferList->mbuffer[0].mData=(AudioUnitSampleType*)calloc(numberofframestoread,sizeof(AudioUnitSampleType));
//...
bufferList->mbuffer[1].mData=(AudioUnitSampleType*)calloc(numberofframestoread,sizeof(AudioUnitSampleType));
//...
//这里有免费的mData
对于(大小i=0;imBuffers[i].mData);
免费(缓冲列表);
[泳池排水沟];

*(2-1)
??当返回if
NULL==bufferList
时,也会泄漏自动释放池。你应该发布你的结构声明。很好。还有,你指的是什么结构声明?好的,我明白了。如果我只调用了malloc,那么仅仅在bufferlist上调用free就足够了&如果是,为什么?任何分配内存的调用,
calloc
/
malloc
/
valloc
,需要调用
free
,因此在这种情况下,您始终需要循环缓冲区的数量并释放所有
mData
干杯谢谢。在这种情况下,Mixerhost示例项目也会泄漏其缓冲区列表,因为这样只会释放缓冲区列表,而不会释放其mData成员。看起来Mixerhost不会为mData分配内存,而只是从
soundStructArray[audioFile].audioDataLeft
,如果查看代码,则会为
soundStructArray释放该数据[audioFile].audioDataLeft