2009-07-20 38 views
0

我的应用程序的辅助线程的运行循环如下。 它有一个嵌套的控制循环。二级NSThread runloop需要autorelease池在哪里?

  • 外部循环运行的应用程序
  • 内循环运行,而一个视图是打开的,则该线程等待而视图未打开的持续时间。
  • 通过内循环的时间很短,只有几分之一秒。

我的代码不会故意在未发布的池中留下任何自动发布的对象,但我不知道操作系统在做什么。

在主线程,可可包装自动释放池周围的每一个通过运行循环。
在这个辅助线程中,我相信最接近的等值是通过内部循环。

inner autorelease pool将每次通过内部循环包装。

围绕内环的中间池包装,使创建并自动释放在这个级别的对象不会保持,直到应用程序终止。

池包装整个runloop。

我怎么能确定这些池的创建和释放正对我的代码的速度有什么影响。
如何确定所有三个池是必需的还是过度杀伤?




代码和解释:

- (void)processLoop 
{ 

    NSAutoreleasePool * outerPool = [[NSAutoreleasePool alloc] init]; 
    [processCondition lock]; 

    //outer loop  
    //this loop runs until my application exits 
    while (![[NSThread currentThread] isCancelled])  
    { 
     NSAutoreleasePool *middlePool = [[NSAutoreleasePool alloc]; 
     if(processGo) 
     { 
      //inner loop 
      //this loop runs typically for a few seconds 
      while (processGo && ![[NSThread currentThread] isCancelled]) 
      { 
       NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc]; init]; 
       //within inner loop 
       //this takes a fraction of a second 
       [self doSomething]; 
       [innerPool release]; 
      } 
      [self tidyThingsUp]; 

     } 
     else 
     { 
      [processCondition wait]; 
     } 
     [middlePool release]; 
    } 
    [processCondition unlock]; 
    [outerPool release]; 
} 

的组合:

  • 内的while循环
  • NSCondition * processCondition
  • 切换和NOprocessGo之间YES

让我停止和启动内循环的同时不取消该线程。

if (processGo == YES) 


执行进入内while循环。

当主线程设置

processGo = NO 

执行离开所述内的while循环和tidys向上
在外循环的下一次通,执行点击

[processCondition wait] 

并等待

如果主线程重置

processGo == YES 

,并呼吁

[processCondition wait] 

执行重新进入内环

回答

5

我真的不能给明确的答案不知道更多关于其中的一些方法做,但应用自动释放池时最大的担忧与每个池处理的对象数量有关。

在那里有一个有趣的blog post,看看额外的自动释放池对创建和销毁一百万个NSObject实例的影响。该帖子的要点是说“自动释放池很便宜”:程序继续获得更高的效率,每个池中的对象更少,直到10个对象/ 1池的比例。 (之后,它快速上涨,因为你快速地为每个对象创建一个池,这显然很愚蠢)。

要做的最好的事情是大致计算出每个发布池将会有多少个对象处理。例如,如果您的内部泳池每次处理一百个对象,并且有一百个传球,那么摆脱那个泳池就会将一万个物体添加到中间泳池 - 这将是一件坏事。另一方面,如果内池处理一个对象每次通过十次,那么肯定,继续并摆脱它。

如果您无法做出决定,请参阅您是否可以找到一种方法来计算内部循环的执行时间或仅在中间池范围内执行的代码,然后根据需要添加/删除autorelease池。请记住:autorelease池很便宜。

1

如何确定是否所有三个 池是必要的或过度杀伤?

你可以简单地评论你的一些池,看看应用程序内存会发生什么。

我怎么能确定这些 池的 创建和释放正对我的 代码的速度有什么影响。

我在游戏的主循环内部创建并释放了一个autorelease池,它运行得非常好。没有打嗝,几乎没有时间。