2009-07-20 42 views
0

我的應用程序的輔助線程的運行循環如下。 它有一個嵌套的控制循環。二級NSThread runloop需要autorelease池在哪裏?

  • 外部循環運行的應用程序
  • 內循環運行,而一個視圖是打開的,則該線程等待而視圖未打開的持續時間。
  • 通過內循環的時間很短,只有幾分之一秒。

我的代碼不會故意在未發佈的池中留下任何自動發佈的對象,但我不知道操作系統在做什麼。

在主線程,可可包裝自動釋放池周圍的每一個通過運行循環。
在這個輔助線程中,我相信最接近的等值是通過內部循環。

inner autorelease pool將每次通過內部循環包裝。

圍繞內環的中間池包裝,使創建並自動釋放在這個級別的對象不會保持,直到應用程序終止。

池包裝整個runloop。

我怎麼能確定這些池的創建和釋放正對我的代碼的速度有什麼影響。
如何確定所有三個池是必需的還是過度殺傷?




代碼和解釋:

- (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
  • 切換和NOprocessGo之間YES

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

if (processGo == YES) 


執行進入內while循環。

當主線程設置

processGo = NO 

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

[processCondition wait] 

並等待

如果主線程重置

processGo == YES 

,並呼籲

[processCondition wait] 

執行重新進入內環

回答

5

我真的不能給明確的答案不知道更多關於其中的一些方法做,但應用自動釋放池時最大的擔憂與每個池處理的對象數量有關。

在那裏有一個有趣的blog post,看看額外的自動釋放池對創建和銷燬一百萬個NSObject實例的影響。該帖子的要點是說「自動釋放池很便宜」:程序繼續獲得更高的效率,每個池中的對象更少,直到10個對象/ 1池的比例。 (之後,它快速上漲,因爲你快速地爲每個對象創建一個池,這顯然很愚蠢)。

要做的最好的事情是大致計算出每個發佈池將會有多少個對象處理。例如,如果您的內部泳池每次處理一百個對象,並且有一百個傳球,那麼擺脫那個泳池就會將一萬個物體添加到中間泳池 - 這將是一件壞事。另一方面,如果內池處理一個對象每次通過十次,那麼肯定,繼續並擺脫它。

如果您無法做出決定,請參閱您是否可以找到一種方法來計算內部循環的執行時間或僅在中間池範圍內執行的代碼,然後根據需要添加/刪除autorelease池。請記住:autorelease池很便宜。

1

如何確定是否所有三個 池是必要的或過度殺傷?

你可以簡單地評論你的一些池,看看應用程序內存會發生什麼。

我怎麼能確定這些 池的 創建和釋放正對我的 代碼的速度有什麼影響。

我在遊戲的主循環內部創建並釋放了一個autorelease池,它運行得非常好。沒有打嗝,幾乎沒有時間。