2011-09-28 59 views
0

我安排一個NSTimer情況是這樣的:爲什麼`cancelPreviousRequestsWithTarget`取消NSTimer?

[NSTimer scheduledTimerWithTimeInterval:.2 target:self selector:@selector(someMethod) userInfo:nil repeats:YES]; 

我能叫invalidateNSTimer從射擊停止,但

[NSTimer cancelPreviousPerformRequestsWithTarget:self]; 

不會停止計時。我已經檢查和[NSRunLoop currentRunLoop]是完全一樣的(正如所料,這些都是對用戶點擊的迴應),當然self實例始終是相同的。 cancel爲什麼不取消?

回答

3

cancelPreviousPerformRequestsWithTarget:是一個NSObject方法,而不是NSTimer方法,它是NSObject的performSelector:方法的反例。

[NSTimer cancelPreviousPerformRequestsWithTarget:self][NSObject cancelPreviousPerformRequestsWithTarget:self]相同,它取消的是以前的任何[self performSelector:… withObject:… afterDelay:…]消息。它與任何NSTimer實例無關。

將消息發送到NSTimer類而不是NSObject類與向類發送alloc的作用相同。沒有類覆蓋它;它的工作原理是因爲NSObject的實現是繼承的,並且出於同樣的原因它也做同樣的事情。

+0

謝謝彼得。我看到了混亂。本質上,我正在調度錯誤的方法。沒有注意到什麼時候或者我切換了。 –

+0

因此,對於靜態方法來說,因爲Class不符合NSObject(我認爲),所以NSTimer是唯一的出路。請忽略此傳達的明顯不好的設計:) –

+1

'Class'類只說明該值是一個類;它並沒有說什麼這個類做了什麼或者不符合什麼,或者是或者不是它的子類。這個問題不在運行時間;運行時重要的是您發送的信息以及您發送給哪個類。此外,類實際上可以使用來自根類(在本例中爲NSObject)的實例方法響應否則無法識別的類消息。 http://developer.apple.com/library/mac/documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163-CH11-TPXREF120 –