关于NSAutoreleasePool的概念性问题

时间:2010-06-05 15:55:43

标签: objective-c cocoa cocoa-touch memory-management

在我的Cocoa程序中,处理自动释放对象的一种非常简单的方法就是在app委托中创建一个调用以下方法的计时器对象,例如:每10秒钟:

if (pool) {
    // Release & drain the current pool to free the memory.
    [pool release];
}

// Create a new pool.
pool = [[NSAutoreleasePool alloc] init];

我能想到的唯一问题是:

1)如果上面的代码在一个单独的线程中运行,那么对象可能会在对旧池的释放调用和新池的创建之间自动释放 - 但这似乎不太可能。

2)显然效率不高,因为如果没有任何内容,池可能会被释放。同样,在10秒的间隙中,许多对象可能会自动释放,导致池增长很多。

但是,上述解决方案似乎非常适合小型和简单的项目。为什么没有人使用它?使用NSAutoreleasePools的最佳做法是什么?

2 个答案:

答案 0 :(得分:3)

您不需要在所有中使用自动释放池,除非您自己明确创建线程。框架应该很好地处理所有这些东西;也许你在发送autorelease消息时误解了对象会发生什么?

答案 1 :(得分:0)

NSAutoreleasePool始终是线程本地的。

将在运行循环的每个滴答中自动刷新池。在你的NSTimer发射的10秒之间,已经有超过数百个滴答声通过,所以游泳池已被清理了数百次。