辅助NSThread runloop中需要自动释放池的位置在哪里?

com*_*eye 0 iphone multithreading objective-c autorelease

我的应用程序的辅助线程的运行循环如下.它有一个嵌套的控制循环.

  • 外循环在应用程序的持续时间内运行
  • 内部循环在一个视图打开时运行,然后线程在视图未打开时等待.
  • 穿过内环很短,只有几分之一秒.

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

在主线程中,cocoa围绕运行循环的每次传递包装自动释放池.
在这个辅助线程中,我相信最接近的等价物是通过内部循环.

所述自动释放池包装每次通过内循环.

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

泳池包装整个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];
}
Run Code Online (Sandbox Code Playgroud)

组合:

  • 一个内在的循环
  • NSCondition*processCondition
  • processGoYES和之间切换NO

允许我停止并启动内部while循环而不取消线程.

if (processGo == YES)
Run Code Online (Sandbox Code Playgroud)


执行进入内部while循环.

当主线程设置时

processGo = NO
Run Code Online (Sandbox Code Playgroud)

执行离开内部while循环并
在外循环的下一次传递中整理,执行命中

[processCondition wait]
Run Code Online (Sandbox Code Playgroud)

并等待

如果主线程重置

processGo == YES
Run Code Online (Sandbox Code Playgroud)

和电话

[processCondition wait]
Run Code Online (Sandbox Code Playgroud)

执行重新进入内循环

Tim*_*Tim 5

如果不了解其中一些方法的作用,我真的无法给出过于明确的答案,但应用自动释放池时的重大问题与每个池处理的对象数量有关.

那里有一篇有趣的博客文章,着眼于额外的自动释放池对一百万个NSObject实例的创建和销毁的影响.该帖子的要点是"自动释放池很便宜":程序继续提高效率,每个池的对象更少,直到10个对象/ 1池比率.(之后它会飞速发展,因为你在为每个对象创建一个池时快速关闭,这显然是愚蠢的.)

你要做的最好的事情是弄清楚每个发布池将要处理的对象数量.例如,如果你的内部池每次传递处理一百个对象,并且有一百个传递,那么摆脱该池将向中间池添加一万个对象 - 这将是一件坏事.另一方面,如果内部池处理一个对象,每个传递10次,那么确定,继续并去除它.

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