память растет в коде аудио-буфера

У меня есть код, который мы используем много раз с нашими приложениями, его class, который принимает образцы буфера и обрабатывает его, а затем отправляет уведомление в основной class. Код c и object-c.

Он работает просто отлично, но есть память, которая я вижу в инструменте-средствах распределения. «общие байты» продолжают расти, в 100 тыс. в секунду. из-за некоторых частей кода, которые я знаю, кто они .

это функция обратного вызова, с линией, которая создает проблемы. это происходит много раз в секунду. Я также не понимаю, куда положить мой *pool :

  static OSStatus recordingCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { AudioBuffer buffer; buffer.mNumberChannels = 1; buffer.mDataByteSize = inNumberFrames * 2; //NSLog(@"%ld",inNumberFrames); buffer.mData = malloc( inNumberFrames * 2 ); // Put buffer in a AudioBufferList AudioBufferList bufferList; bufferList.mNumberBuffers = 1; bufferList.mBuffers[0] = buffer; // block A OSStatus status; status = AudioUnitRender(audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList); //end block A NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData; int16_t average ; for(int i=0; i 100) // lineB reducer++; //blockC if(reducer==150 ) { average= preSignal + alpha*(average-preSignal); //NSLog(@"average:%d",average); //call scene [dict setObject:[NSNumber numberWithInt:average] forKey:@"amp" ] ; [[NSNotificationCenter defaultCenter] postNotificationName:@"DigitalArrived" object:nil userInfo:dict]; reducer=0; preSignal=average; } //end blockC } free(buffer.mData); [pool release]; return noErr; } в  static OSStatus recordingCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData) { AudioBuffer buffer; buffer.mNumberChannels = 1; buffer.mDataByteSize = inNumberFrames * 2; //NSLog(@"%ld",inNumberFrames); buffer.mData = malloc( inNumberFrames * 2 ); // Put buffer in a AudioBufferList AudioBufferList bufferList; bufferList.mNumberBuffers = 1; bufferList.mBuffers[0] = buffer; // block A OSStatus status; status = AudioUnitRender(audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList); //end block A NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData; int16_t average ; for(int i=0; i 100) // lineB reducer++; //blockC if(reducer==150 ) { average= preSignal + alpha*(average-preSignal); //NSLog(@"average:%d",average); //call scene [dict setObject:[NSNumber numberWithInt:average] forKey:@"amp" ] ; [[NSNotificationCenter defaultCenter] postNotificationName:@"DigitalArrived" object:nil userInfo:dict]; reducer=0; preSignal=average; } //end blockC } free(buffer.mData); [pool release]; return noErr; } 

OK: игнорировать blockC на секунду. удаление blockA и lineB решает все. удаляя только один из них – утечки.

я просто не могу понять, что здесь растет.

Просто предположение, но выделение нового NSAutoreleasePool внутри вашей функции обратного вызова записи (которая является сверхкритической функцией), вероятно, является плохой идеей.

Вообще-то, зачем ты здесь вообще это делаешь? Разве у вас просто нет одного пула для всего приложения, в вашем main.m? Вероятно, это вызывает некоторые утечки.

Вы не должны делать ничего, что требует выделения памяти внутри обратного вызова рендеринга Audio Unit. Требования в реальном времени слишком жесткие для использования общей цели C.

Поскольку вы не должны выделять пул или любую другую память внутри обратного вызова аудиоустройства, вам не следует использовать какие-либо методы Objective C, которые потенциально или фактически создают любые объекты, такие как модификация словаря или создание уведомлений. Возможно, вам придется вернуться к использованию простой C внутри обратного вызова рендеринга (установить флаг) и выполнить обмен сообщениями Objective C за пределами обратного вызова рендеринга в другом streamе (например, после опроса флагов (ов) в обратном вызове таймера).