1

在我的代码中,当我有一个每秒被调用多次的回调函数时,我正在使用音频缓冲区。此回调在处理音频的类中,而不是在 app 的主类中。

一开始,我收到了在回调期间多次记录的警告:

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 回答