【问题标题】:Handling AutoRelease Pools and Threads处理 AutoRelease 池和线程
【发布时间】:2011-11-03 21:54:26
【问题描述】:

如果我创建一个带有回调之类的线程..

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

我假设任何自动释放的东西都不会真正被释放,因为池永远不会被耗尽。 我可以把事情改成这样:

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

但是如此频繁地分配/删除似乎有点浪费。有没有办法我可以留出一块内存并在池满时释放它?

【问题讨论】:

  • “满”是什么意思?自动释放池的容量没有任何特定限制。
  • 我想这就是我好奇的地方。如果有办法限制容量或查询大小。

标签: iphone objective-c memory-management nsautoreleasepool


【解决方案1】:

别担心,因为Autorelease is Fast。你的第二个选项很好。事实上,在 ARC 中,由于新的 @autoreleasepool { } 语法,除了这两个选项之外,其他任何事情都很难做。

【讨论】:

  • 没错。 但是这么频繁地分配/删除似乎有点浪费看起来很慢绝不是优化某些东西的好理由。
【解决方案2】:

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

如果您不生成太多自动释放的内存,那么它不会有好处,您只需要外部池。

如果您分配了足够的内存以使单次迭代无关紧要,但在您完成时还有很多,那么您可以每 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];

* 你需要自己确定重要是什么。

【讨论】:

  • 这几乎肯定是在浪费代码;您必须非常快速地旋转 while() 循环,并且在其中做的很少,因为池分配的开销很重要。除非您测量了性能问题,否则不要为这种过早的优化而烦恼
猜你喜欢
  • 2018-07-19
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多