iphone - 什么时候释放 NSThread 是安全的?

标签 iphone objective-c multithreading

下面是我的辅助 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]

执行重新进入内循环

最佳答案

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

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

关于iphone - 什么时候释放 NSThread 是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1151637/

相关文章:

iphone:如何进行翻页

iphone - 当点击网页内播放 YouTube 视频时,iOS 6.1 UIWebview 崩溃

ios - 从 iPhone 照片库中选择一个视频

objective-c - NSOpenPanel 第一次访问文件夹后不显示文件

c# - 一些 NGit 东西阻​​止 C# 应用程序正确关闭

java - Android Thread getName 给出当前类名

iphone - UITextField 中的自动完成电子邮件功能

iphone - 在Objective C中初始化自定义类型的@property

objective-c - 在 iOS 中注册自定义文件类型

c++ - 为什么我的多线程程序没有正确终止?