在我的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的最佳做法是什么?
答案 0 :(得分:3)
您不需要在所有中使用自动释放池,除非您自己明确创建线程。框架应该很好地处理所有这些东西;也许你在发送autorelease
消息时误解了对象会发生什么?
答案 1 :(得分:0)
NSAutoreleasePool始终是线程本地的。
将在运行循环的每个滴答中自动刷新池。在你的NSTimer发射的10秒之间,已经有超过数百个滴答声通过,所以游泳池已被清理了数百次。