0

アプリで何度も使用するコードがあります。このコードは、バッファーサンプルを取得して処理し、メインクラスに通知を送り返します。コードは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つだけを削除します-リーク。

私はここで何が成長しているのか理解できません。

4

2 に答える 2

0

推測ですが、レコーディング コールバック関数 (非常にタイム クリティカルな関数) 内に新しい NSAutoreleasePool を割り当てることは、おそらく悪い考えです。

実際、なぜここでこれをやっているのですか?main.m で、アプリ全体のプールを 1 つだけ持つべきではありませんか? これはおそらくあなたのリークのいくつかを引き起こしています.

于 2012-04-23T11:24:49.517 に答える
0

Audio Unit レンダー コールバック内でメモリの割り当てを必要とすることは何もしないでください。汎用の Objective C を使用するには、リアルタイム要件が厳しすぎます。

オーディオ ユニットのコールバック内でプールやその他のメモリを割り当ててはならないため、辞書の変更や通知の作成など、オブジェクトを作成する可能性がある、または実際に作成する Objective C メソッドを使用しないでください。レンダー コールバック内でプレーン C を使用するように戻し (フラグを設定)、Objective C メッセージングを別のスレッドでレンダー コールバックの外で実行する必要がある場合があります (たとえば、タイマー コールバックでフラグをポーリングした後)。

于 2012-04-23T15:56:32.737 に答える