2011-09-28 56 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 –