首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理AutoRelease池和线程

处理AutoRelease池和线程
EN

Stack Overflow用户
提问于 2011-08-26 01:33:14
回答 2查看 259关注 0票数 1

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

代码语言:javascript
复制
NSAutoreleasePool* pool = [NSAutoreleasePool alloc] init];
while(1) {
   //Process Stuff
}
[pool release];

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

代码语言:javascript
复制
while(1) {
   NSAutoreleasePool* pool = [NSAutoreleasePool alloc] init];
   //Process Stuff
   [pool release];
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-26 01:44:50

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

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

如果您分配了足够的内存,使得单次迭代无关紧要,但在您完成时有很多内存,那么您可以每X次迭代创建并释放池。

代码语言:javascript
复制
#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];

*你需要确定对自己来说什么是重要的。

票数 1
EN

Stack Overflow用户

发布于 2011-08-26 01:37:07

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7194678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档