自动释放池解释

时间:2012-04-12 11:22:32

标签: objective-c xcode

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

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

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    

我到底在这做了什么? 这是为什么 ? 从记忆方面来说还可以吗?

非常感谢。

1 个答案:

答案 0 :(得分: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

如果您的回调运行并非主线程,则应该执行新池。如果没有,你的物体可能会嗤之以鼻。 :)

如果使用自动释放对象处理大量数据并且想要释放内存,则创建一个池,处理,释放池。