2010-05-24 143 views
2

雖然它似乎不會在模擬器上造成問題,但在設備上使用performSelectorInBackground會導致內存泄漏。或者至少這就是儀器所說的。看看代碼,我不知道原因可能是什麼。 我試圖將受影響的代碼剝離到最低限度,但仍然很奇怪,儀器每次執行這段代碼時都會顯示泄漏。PerformSelectorInBackground在設備上泄漏

這裏有什麼不尋常的事情發生嗎?

//In viewcontrollerA: 
    -(void)mainLoop 
    { 
    [self.viewControllerB performSelectorInBackground:@selector(calculateTotals) withObject:nil]; 

      //This gives the same problem 
     //[NSThread detachNewThreadSelector:@selector(calculateTotals) toTarget:self.viewControllerB withObject:nil]; 

      //UI stuff ... 

    } 

    //viewControllerB: 
    -(void)calculateTotals 
    { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    //Heavy calculations ... 


    [pool release]; 
    } 

編輯: 我還在找這個,似乎泄漏是由一個事實,即在堆棧中向下某處[NSThread開始]永遠沒有後跟[NSThread退出]造成的。所以看起來好像偶爾會有一個線程一直運行而沒有結束。 現在我的問題是,我能做些什麼來終止那些「懸掛」手動威脅?

+0

儀器說什麼樣的物體泄漏? – kperryua 2010-05-24 05:04:53

+0

我的最新猜測是,它是來自performSelectorInBackground的保留週期,它保留了它的目標,本文可能會有所幫助:http://www.mikeash.com/pyblog/friday-qa-2010-04-30-dealing- with-retain-cycles.html – 2010-05-24 05:40:09

+0

@kperryua它說泄漏來自'GeneralBlock-3584',挖掘它揭示了可重複調用是 - [NSThread start]和+ [NSThread exit]。我真的無法彌補這應該是什麼意思? – Oysio 2010-05-24 13:27:38

回答

0

也許你的一個線程拋出異常?線程中的異常不會在調試控制檯中報告,您必須捕獲線程中的異常。