下面是我的辅助 NSThread* processThread 的运行循环
要关闭我调用的线程
//cancel secondary thread
[processThread cancel]
//signal condition
[processCondition broadcast];
那么拨打电话是否安全:
[processCondition release];
[processThread release];
或者我需要确保线程已经完成吗?
也许像这样?
NSTimeInterval timeout = [NSDate timeIntervalSinceReferenceDate] + (1.0/15.0);
while ([processThread isExecuting] && [NSDate timeIntervalSinceReferenceDate] < timeout)
{
[NSThread sleepForTimeInterval: 1.0/1000.0 ];
}
[processCondition release];
[processThread release];
详细代码和解释:
- (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
and NO
允许我停止和启动内部 while 循环而不取消线程。
if (processGo == YES)
执行进入内部while循环。
当主线程设置时
processGo = NO
执行离开内部 while 循环并整理
在外循环的下一次传递中,执行命中
[processCondition wait]
并等待
如果主线程重置
processGo == YES
并打电话
[processCondition wait]
执行重新进入内循环
是的,如果您已经完成了 NSThread 的调用,那么调用 release 是安全的。在非 GC Objective C 代码中,习惯用法是,一旦访问完对象,就可以释放它。如果有其他东西需要该对象,包括对象本身,他们的工作就是对其进行保留。一般来说,如果一个对象不能在任意时间被安全处置,它将在处于不安全状态时保留自身,并在可以安全处置时释放自身。
这就是 NSThread 和 NSURLConnection 之类的工作方式(NSURLConnection 实际上保留了它的委托,并做了很多奇特的事情来应对发生的保留循环。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)