2011-09-15 63 views
0

----問題由自己解決,信息在我的評論更新----的dealloc在[超級的dealloc]

打了兩次電話和崩潰我有具有周期性的NSTimer視圖控制器。我所說的計時器無效當我刪除視圖控制器:

- (void)dealloc 
{ 
    NSLog(@"dealloc called"); 
    if ([myTimer isValid]) { 
     [myTimer invalidate]; 
    } 
    [super dealloc]; 
} 

我發現了一個意外的行爲,該[myTimer無效]將立即打電話給我的視圖控制器的dealloc。這就是爲什麼我把isValid檢查以避免崩潰。但[超級dealloc]將被調用兩次,並崩潰應用程序。

因此,我有兩個問題:

  1. 什麼是無效的定時器的正確方法?

  2. 爲什麼計時器的無效方法調用視圖控制器的dealloc方法?

感謝

利奧

+0

您應該在viewDidUnload下放置無效語句以避免崩潰。 –

+0

這聽起來像是一些奇怪的行爲。是否還有其他的對象持有對你的視圖控制器的引用 - 如果沒有,有沒有可能,一旦定時器被從NSRunLoop中移除並釋放,視圖控制器就不再引用它了(所以被解除分配)? – Stuart

+0

@studev,你是對的。我只是認爲視圖控制器被錯誤地發佈在這個代碼的一面。計時器的無效將釋放目標,但目標的dealloc不應該是呼叫。而保留計數應該從2減少到1.因爲當我安排定時器時,計時器保留了目標。 – leo

回答

1

這聽起來像一些奇怪的行爲。是否還有其他對象持有對視圖控制器的引用?

如果沒有,有可能一旦定時器被刪除,從運行循環中釋放的視圖控制器沒有任何引用它(並且被釋放)。

3

截至CocoaDev: NSTimer描述:

這裏有一些規則,可能會幫助你的NSTimer:

定時器保留目標和userInfo對象。

定時器在計劃時會自動保留在運行循環中。

如果定時器沒有設置爲重複,它會在發射時自動失效。

調用invalidate時,會從run循環中釋放一個定時器。

計時器在調用invalidate時釋放target和userInfo對象。

換句話說,如果您釋放重複定時器而不使其失效,它將繼續重複,因爲運行循環正在保留它。但是,如果您不想在應用程序退出之前停止計時器,或者計時器不重複,則可以在調用計時器後釋放計時器而不調用invalidate。

+1

如果您複製並粘貼您自己沒有編寫過的內容,請引用原始來源並明確說明文本不屬於您的內容。剽竊被詬病,可能被認爲是非法的。 – 2011-09-15 10:59:41

+0

對不起....我不知道這是怎麼完成的..我是一個新成員.. :)會記住這一點。 –