我的应用程序的辅助线程的运行循环如下。它有一个嵌套的控制循环。
- 外循环在应用程序期间运行
- 内部循环在一个视图打开时运行,然后线程在视图未打开时等待。
- 通过内循环的时间很短,只有几分之一秒。
我的代码不会故意将任何自动释放的对象留在未释放的池中,但我不知道操作系统在做什么。
在主线程中,cocoa 在每次通过运行循环时都包装了一个自动释放池。
在这个次要线程中,我相信最接近的等价物是通过内部循环。
内部自动释放池包装每个通过内部循环的通道。
中间池环绕内部循环,因此在此级别创建和自动释放的对象在应用程序终止之前不会保留。
外部池包裹了整个运行循环。
我如何确定所有这些池的创建和发布对我的代码速度有什么影响。
我如何确定所有三个池是必要的还是矫枉过正的?
代码和解释:
- (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
- 在和
processGo
之间切换YES
NO
允许我在不取消线程的情况下停止并启动内部 while 循环。
if (processGo == YES)
执行进入内部while循环。
当主线程设置
processGo = NO
执行离开内部while循环并
在外部循环的下一次通过时整理,执行命中
[processCondition wait]
并等待
如果主线程重置
processGo == YES
并打电话
[processCondition wait]
执行重新进入内循环