когда безопасно выпустить NSThread? - PullRequest
4 голосов
/ 20 июля 2009

Ниже приведен runloop для моего вторичного 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
  • переключение processGo между YES и NO

позволяет мне останавливать и запускать внутренний цикл while, не отменяя поток.

if (processGo == YES)


выполнение входит во внутренний цикл while.

Когда основной поток устанавливает

processGo = NO

выполнение оставляет внутренний цикл while и приводит в порядок
при следующем проходе внешнего цикла выполнение достигает

[processCondition wait]

и ждет

если основной поток сбрасывается

processGo == YES

и звонки

[processCondition wait]

выполнение повторно входит во внутренний цикл

1 Ответ

8 голосов
/ 20 июля 2009

Да, безопасно вызывать release для NSThread, если вы закончили с ним. В коде Objective C, не относящемся к GC, идиома заключается в том, что, как только вы закончите доступ к объекту, вы можете его освободить. Если что-либо еще нуждается в этом объекте, в том числе сам объект, его работа заключается в том, чтобы удержать его. В целом, если объект не может быть безопасно удален в произвольные моменты времени, он сохранит себя, пока он находится в небезопасном состоянии, и освободится, когда его можно безопасно утилизировать.

Вот как работают такие вещи, как NSThread и NSURLConnection (NSURLConnection фактически сохраняет своего делегата и делает много причудливых вещей, чтобы справиться с возникающим циклом сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...