在我的代码中我使用音频缓冲区,当我有一个每秒被调用多次的回调函数。这个回调是在一个处理音频的类中,而不是在应用程序的主类中。
一开始我收到这个警告,在回调期间多次记录:
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
我到底在这做了什么? 这是为什么 ? 从记忆方面来说还可以吗?
非常感谢。
答案 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
如果您的回调运行并非主线程,则应该执行新池。如果没有,你的物体可能会嗤之以鼻。 :)
如果使用自动释放对象处理大量数据并且想要释放内存,则创建一个池,处理,释放池。