【问题标题】:when is it safe to release an NSThread?什么时候释放 NSThread 是安全的?
【发布时间】:2009-07-20 03:49:04
【问题描述】:

下面是我的辅助 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
  • YESNO 之间切换processGo

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

if (processGo == YES)


执行进入内部while循环。

当主线程设置时

processGo = NO

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

[processCondition wait]

等待

如果主线程重置

processGo == YES

并调用

[processCondition wait]

执行重新进入内循环

【问题讨论】:

    标签: iphone objective-c multithreading


    【解决方案1】:

    是的,如果你完成了对 NSThread 调用 release 是安全的。在非 GC 目标 C 代码中,习惯用法是,一旦您完成对对象的访问,您就可以释放它。如果还有其他需要该对象的东西,包括对象本身,他们的工作就是保留它。一般来说,如果一个对象不能在任意时间被安全地处置,它会在它处于不安全状态时保留自己,并在可以安全处置时释放自己。

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

    【讨论】:

    • 仅仅因为您“完成”并不意味着线程完全执行完毕。在线程上调用cancel 并不能保证您可以立即释放它。
    • 是的,但是在执行时它会保留自己。
    • @Louis:你是对的 - 抱歉,没有仔细阅读文档。忽略我最后的评论。
    • 没问题,线程和保留语义是棘手的事情。过去还存在一些非常讨厌的错误和陷阱,使一切变得比文档所暗示的要复杂得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多