2014-03-06 28 views
1

我嘗試使用nstimer點擊顯示/隱藏視圖。如何取消之前的NSTimer如果新的被觸發

@interface 
     @property (nonatomic, retain)NSTimer *timer; 
     UIView *view; 
     @implementation 
     view.hiden=YES; 
     - (void)handleTap:(UITapGestureRecognizer *)sender{ 
     if([timer isValid)]{ 
timer.invalidate;///that gives me _EXC_BAD_ACCESS 
} 
     view.hiden=NO; 
     timer = [NSTimer scheduledTimerWithTimeInterval:3.0 
                target:self 
                selector:@selector(targetMethod) 
                userInfo:nil 
                repeats:NO]; 


     } 
     -(void)targetMethod{ 
     view.hiden=YES; 
     } 

如果您瞭解此代碼的某些內容,則可以看到該問題。如果我點擊一次並等待3秒鐘,則效果很好。但如果我點擊它並在1.5秒後再次點擊,它應該製作另一個定時器盒並在3秒後隱藏它,但它在1.5秒後隱藏它,因爲舊的正在射擊。你可以看到,我試圖使它無效,但給我錯誤。

那麼如何以適當的方式摧毀它?

回答

2

像這樣:

- (void)timerFired:(id)sender { 
    _timer = nil; 
    // do thing here 
} 

- (IBAction)handleTap:(id)sender { 
    [_timer invalidate]; 
    _timer = [NSTimer scheduledTimerWithTimeInterval:3.0 
               target:self 
              selector:@selector(timerFired:) 
              userInfo:nil 
              repeats:NO]; 
} 

- (void)dealloc { 
    [_timer invalidate]; 
} 

有你需要做一些關鍵的東西:

  • 在處理計時器的射擊代碼,設置實例變量爲零。
  • 在創建新計時器之前使舊計時器無效。
  • 不用擔心在使其失效之前檢查定時器的有效性。如果遵循這種技術,定時器將有效或無。撥打invalidate是絕對安全的。
  • 您無需在無效和重新分配之間無_timer;這段代碼全部在主線程上。如果你只是取消計時器,你會的。
    • 原因是這個計時器已經安排在runloop上。這保證了直到runloop的下一次迭代纔會觸發。 runloop不會迭代,直到你返回。
  • dealloc,你應該使計時器無效。 (這可能是更適合你的viewDidDisppear:做到這一點。如果你這樣做,確保你後無話)
+0

謝謝,這是有益的;) –

+0

我又增加了子彈點到列表中。 –

0
//before firing a timer null it always 
[timer invalidate]; 
timer=nil; 

//now create a new instance of it 
timer = [NSTimer scheduledTimerWithTimeInterval:3.0 
                target:self 
                selector:@selector(targetMethod) 
                userInfo:nil 
                repeats:NO]; 
0

後無效計時器,該屬性設置爲nil,以便下次你來通了,你不是白白持有到一個無效的計時器。

相關問題