Objective c 在NSO操作中释放对象
我已将NSOperation子类化,并在需要时将其实例添加到NSOperationQue中。 在NSOperation的主要功能中,我创建了一个AudioBufferList,然后在完成后释放它 在仪器的内存分配部分显示,这些音频缓冲列表的实例在不断攀升。有效字节数不断攀升,缓冲区的mdata部分似乎是罪魁祸首 这是我代码的一部分 我是否正确地释放了缓冲列表,或者仪器是否报告错误Objective c 在NSO操作中释放对象,objective-c,memory-management,Objective C,Memory Management,我已将NSOperation子类化,并在需要时将其实例添加到NSOperationQue中。 在NSOperation的主要功能中,我创建了一个AudioBufferList,然后在完成后释放它 在仪器的内存分配部分显示,这些音频缓冲列表的实例在不断攀升。有效字节数不断攀升,缓冲区的mdata部分似乎是罪魁祸首 这是我代码的一部分 我是否正确地释放了缓冲列表,或者仪器是否报告错误 -(void)main { //autorelase stuff in here NSAut
-(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)
??当返回ifNULL==bufferList
时,也会泄漏自动释放池。你应该发布你的结构声明。很好。还有,你指的是什么结构声明?好的,我明白了。如果我只调用了malloc,那么仅仅在bufferlist上调用free就足够了&如果是,为什么?任何分配内存的调用,calloc
/malloc
/valloc
,需要调用free
,因此在这种情况下,您始终需要循环缓冲区的数量并释放所有mData
干杯谢谢。在这种情况下,Mixerhost示例项目也会泄漏其缓冲区列表,因为这样只会释放缓冲区列表,而不会释放其mData成员。看起来Mixerhost不会为mData分配内存,而只是从soundStructArray[audioFile].audioDataLeft
,如果查看代码,则会为soundStructArray释放该数据[audioFile].audioDataLeft