アプリで何度も使用するコードがあります。このコードは、バッファーサンプルを取得して処理し、メインクラスに通知を送り返します。コードはcとobjective-cです。
それはうまく機能しますが、楽器割り当てツールで見ることができるメモリが増えています。「全体のバイト数」は、1秒あたり100kで増え続けています。私が彼らが誰であるかを知っているコードのいくつかの部分のために。
これはコールバック関数であり、問題を引き起こす行があります。それは1秒間に何度も起こります。私はまた、私の場所を本当に理解していません*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 < inNumberFrames; i++)
{
average=q[i];
if(average>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を1秒間無視します。blockAとlineBを削除すると、すべてが解決します。それらの1つだけを削除します-リーク。
私はここで何が成長しているのか理解できません。