1

私のコードでは、1秒間に何度も呼び出されるコールバック関数があるときに、オーディオバッファーを使用しています。このコールバックは、音声を処理するクラスにあり、アプリのメインクラスにはありません。

開始時に、コールバック中に何度もログに記録されるこの警告が表示されていました。

Object 0x93cd5e0 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() 

それから私はこの行をコールバック関数に入れるように言われました:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

その後、このエラーは消えました。しかし、1秒間に何度もプールを割り当てることがどのように可能であるか理解できません。おそらく、メモリの問題があります。私はそれよりも私がこれを最後に置かなければならないのを見ました:

[pool drain];

だから私はこれを持っています:

OSStatus status;
    status = AudioUnitRender(audioUnit, 
                             ioActionFlags, 
                             inTimeStamp, 
                             inBusNumber, 
                             inNumberFrames, 
                             &bufferList); 


    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  // that line added

    //run on evert sample
    int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData;
    for(int i=0; i < inNumberFrames; i++)
    {
    static int stateMachineSelector=1;
    static int sampelsCounter=0;

   // CODE TO HANDLE THE SAMPLES ...
    }
   [pool drain];  // issue here    

私はここで正確に何をしましたか?何故ですか ?記憶の面からは大丈夫ですか?

どうもありがとう 。

4

1 に答える 1

0

自動解放を受信する他のすべてのオブジェクトを使用して自動解放プールを開始する場合、または[[NSAutoreleasePool alloc] init]コンビニエンスアロケータで作成された場所(、、またはNSArray *ary = [NSArray array];そのUIView *view = [[[UIView alloc] init] autorelease];プール内にある場合)。

それで:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *ary = [NSArray array];
[pool release]; // this will also release and dealoc the *ary from memory

メインスレッドではなくコールバックを実行している場合は、新しいプールを実行する必要があります。そうでない場合、オブジェクトはニルヴァーナにネギを塗る可能性があります。:)

自動解放オブジェクトを使用して大量のデータを処理し、メモリを解放したい場合は、プールを作成し、処理して、プールを解放します。

于 2012-04-12T11:33:56.913 に答える