何时释放NSThread是否安全?

时间:2009-07-20 03:49:04

标签: iphone objective-c multithreading

以下是我的辅助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];
}

组合:

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

允许我在不取消线程的情况下停止并启动内部while循环。

if (processGo == YES)


执行进入内部while循环。

当主线程设置

processGo = NO

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

[processCondition wait]

并等待

如果主线程重置

processGo == YES

并致电

[processCondition wait]

执行重新进入内循环

1 个答案:

答案 0 :(得分:8)

是的,如果您已完成NSThread,则可以安全地调用NSThread。在非GC Objective C代码中,习惯用法是,一旦您完成对象的访问,您就可以释放它。如果还有其他东西需要该对象,包括对象本身,那么他们的工作就是保留它。一般情况下,如果一个物体在任意时间都不能安全地处理,它会在处于不安全状态时自行保留,并在可以安全处置时自行释放。

这就是NSThread和NSURLConnection之类的工作方式(NSURLConnection实际上保留了它的委托,并且做了很多花哨的事情来处理发生的保留循环。