2009-07-20 16 views
4

下面是我的中學NSThread *的runloop processThread何時可以安全釋放NSThread?

要關閉線程我打電話

//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 * processCo ndition
  • 切換和NOprocessGo之間YES

讓我停止和啓動內循環的同時不取消該線程。

if (processGo == YES) 


執行進入內while循環。

當主線程設置

processGo = NO 

執行離開所述內的while循環和tidys向上
在外循環的下一次通,執行點擊

[processCondition wait] 

並等待

如果主線程重置

processGo == YES 

,並呼籲

[processCondition wait] 

執行重新進入內環

回答

7

是的,它是安全調用對一個NSThread版本,如果你用它做。在非GC Objective C代碼中,這個習慣用法是,一旦你完成訪問一個對象,你可以釋放它。如果其他任何東西都需要這個對象,包括對象本身,那麼他們的工作就是要保留它。通常情況下,如果一個物體不能在任意時間安全放置,它將在它處於不安全狀態時自行保留,並且在可以安全處置時釋放它自身。

這是怎麼會事象NSThread和NSURLConnection的工作(實際上NSURLConnection的保留其委託並做了很多花哨的東西,以應對出現的保留循環。

+0

僅僅因爲你「用它做」不在線程中調用`cancel'並不能保證你可以立即釋放它 – Tim 2009-07-20 05:05:03

相關問題