以下是我的辅助NSThread * processThread
的runloop关闭我打电话的帖子
//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];
}
组合:
processGo
和YES
NO
允许我在不取消线程的情况下停止并启动内部while循环。
if (processGo == YES)
执行进入内部while循环。
当主线程设置
时processGo = NO
执行离开内部while循环并整理
在外循环的下一次传递中,执行命中
[processCondition wait]
并等待
如果主线程重置
processGo == YES
并致电
[processCondition wait]
执行重新进入内循环 的
答案 0 :(得分:8)
是的,如果您已完成NSThread,则可以安全地调用NSThread。在非GC Objective C代码中,习惯用法是,一旦您完成对象的访问,您就可以释放它。如果还有其他东西需要该对象,包括对象本身,那么他们的工作就是保留它。一般情况下,如果一个物体在任意时间都不能安全地处理,它会在处于不安全状态时自行保留,并在可以安全处置时自行释放。
这就是NSThread和NSURLConnection之类的工作方式(NSURLConnection实际上保留了它的委托,并且做了很多花哨的事情来处理发生的保留循环。