处理自动释放池和线程

时间:2011-08-25 17:33:14

标签: iphone objective-c memory-management nsautoreleasepool

如果我创建一个带回调的线程,比如..

NSAutoreleasePool* pool = [NSAutoreleasePool alloc] init];
while(1) {
   //Process Stuff
}
[pool release];

我认为任何自动释放的东西都永远不会被释放,因为池永远不会被耗尽。 我可以改变这样的事情:

while(1) {
   NSAutoreleasePool* pool = [NSAutoreleasePool alloc] init];
   //Process Stuff
   [pool release];
}

但是经常分配/删除似乎有点浪费。有没有办法可以留出一块内存并在游戏池满了后释放它?

2 个答案:

答案 0 :(得分:7)

不要担心,因为Autorelease is Fast。你的第二个选择没问题。事实上,在ARC中,由于新的@autoreleasepool { }语法,除了这两个选项之外很难做任何事情。

答案 1 :(得分:1)

如果在循环的每次迭代中分配了大量的自动释放内存,那么为每次迭代创建和释放一个新池是正确的做法,以防止内存堆积。

如果你没有产生太多的自动释放内存,那么它就没有用了,你只需要外部池。

如果你分配了足够的内存,单个迭代是无关紧要的,但是当你完成时有很多,那么你可以每X次迭代创建和释放池。

#define IterationsPerPool 10
NSAutoreleasePool* pool = [NSAutoreleasePool new];
int x = 0;
while(1) {
   //Process Stuff
   if(++x == IterationsPerPool) {
      x = 0;
      [pool release];
      pool = [NSAutoreleasePool new];
   }
}
[pool release];

*您需要确定重要的内容。