如何在使NSTimer失效后“验证”它?

时间:2012-02-13 07:34:36

标签: objective-c cocoa nstimer nsrunloop

所以基本上,我有这个计时器,它应该在收到一个键事件时重复,并在用户释放键时失效。但是,即使通过调用NSRunLoop中的addTimer:forMode:,我也无法“验证”计时器。有谁知道为什么会发生这种情况以及如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:37)

您无法使用无效的计时器。

来自Apple Docs:

  

在运行循环上安排后,计时器将在指定的位置触发   间隔,直到它失效。非重复计时器无效   火灾后立即发生。但是,对于重复计时器,你   必须通过调用invalidate来自行使计时器对象无效   方法。调用此方法请求从中删除计时器   当前运行循环;因此,您应该始终调用invalidate   来自安装计时器的同一线程的方法。   使计时器失效会立即禁用它,以便不再使用它   影响运行循环。运行循环然后删除并释放   计时器,在invalidate方法返回之前或在某些方法返回时   以后点。一旦失效,就不能重复使用计时器对象。

答案 1 :(得分:14)

一旦你使NSTimer失效,你就不应该再次使用它了。

相反,创建一个新的计时器实例,并使用该实例添加到NSRunLoop的addTimer方法。我个人更喜欢只调用NSTimer的scheduledTimerWithTimeInterval,因为它只需一次性完成所有操作。

来自NSTimer docs

  

调用此方法请求从当前删除计时器   运行循环;因此,您应该始终调用invalidate方法   来自安装计时器的同一个线程。无效   计时器立即禁用它,以便它不再影响运行   环。然后运行循环移除并释放计时器   在invalidate方法返回之前或稍后的某个时间点。一旦   无效,计时器对象无法重复使用。