下面是我的辅助 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
- 在
YES
和NO
之间切换processGo
允许我在不取消线程的情况下停止和启动内部 while 循环。
if (processGo == YES)
执行进入内部 while 循环。
主线程设置时
processGo = NO
执行离开内部 while 循环并整理
在外循环的下一次传递中,执行命中
[processCondition wait]
等待
如果主线程重置
processGo == YES
和通话
[processCondition wait]
执行重新进入内循环
最佳答案
是的,如果你完成了它,调用 NSThread 的 release 是安全的。在非 GC Objective C 代码中,习惯用法是一旦你访问完一个对象,你就可以释放它。如果有任何其他东西需要那个对象,包括对象本身,那么他们的工作就是对它进行保留。一般来说,如果一个对象不能在任意时间安全处置,它会在处于不安全状态时保留自己,并在可以安全处置时释放自己。
这就是 NSThread 和 NSURLConnection 之类的东西的工作方式(NSURLConnection 实际上保留了它的委托(delegate)并做了很多花哨的事情来应对发生的保留循环。
关于iphone - 什么时候释放 NSThread 是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1151637/