2010-09-20 93 views
2

我有一個類NSTimer *myTimer;變量。在某些時候,我做的:NSTimer不停止

myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(doStuff) userInfo:nil repeats: YES]; 

進一步,我有一個方法:

- (void)dealloc 
{ 
if (myTimer) { //if myTimer==nil it already has been stopped in the same way 
    [myTimer invalidate]; 
    myTimer = nil; 
} 
} 

現在,問題:

- (void)doStuff 
{ 
    if(myTimer) 
    { 
    //do stuff 
    } 
} 

,我停止我的定時器類時通過釋放當我釋放課程時,定時器繼續運行,並繼續發射事件。難道我做錯了什麼?看起來dealloc方法從來沒有被調用,否則myTimer將爲零,即使選擇器被觸發,它也不會進入if(myTimer)

回答

7

這絕不會工作,因爲定時器保留它們的目標,這意味着你的方法永遠不會直到被調用後你已經invalidated該定時器。

欲瞭解更多信息,請參閱NSTimer文檔和"Dangerous Cocoa Calls"

+2

所以你應該清理計時器,然後再期待物體消失。 – 2010-09-20 16:09:09

+0

@Joshua +1這就是我所說的......你必須使計時器無效以便讓你的對象釋放,這可能最終觸發'dealloc'方法(只是沒有太多的單詞):) – 2010-09-20 16:11:59

0

您是否嘗試過在您的處置方便的調試工具,這個博客帖子?如果你在dealloc方法中設置了一個斷點,會發生什麼?另外,您應該在創建過程中發佈更多的上下文。是否有可能不止一次地創建定時器,從而替換原始的(但不是使其無效)並將它放在那裏以隨意觸發?

+0

是的..沒有達到dealloc – Daniel 2010-09-20 16:32:31

+0

我不是創建它多次。只在一個地方,只有一次。 – Daniel 2010-09-20 16:36:01