所以基本上,我有这个计时器,它应该在收到一个键事件时重复,并在用户释放键时失效。但是,即使通过调用NSRunLoop中的addTimer:forMode:
,我也无法“验证”计时器。有谁知道为什么会发生这种情况以及如何解决这个问题?感谢。
答案 0 :(得分:37)
您无法使用无效的计时器。
来自Apple Docs:
在运行循环上安排后,计时器将在指定的位置触发 间隔,直到它失效。非重复计时器无效 火灾后立即发生。但是,对于重复计时器,你 必须通过调用invalidate来自行使计时器对象无效 方法。调用此方法请求从中删除计时器 当前运行循环;因此,您应该始终调用invalidate 来自安装计时器的同一线程的方法。 使计时器失效会立即禁用它,以便不再使用它 影响运行循环。运行循环然后删除并释放 计时器,在invalidate方法返回之前或在某些方法返回时 以后点。一旦失效,就不能重复使用计时器对象。
答案 1 :(得分:14)
一旦你使NSTimer失效,你就不应该再次使用它了。
相反,创建一个新的计时器实例,并使用该实例添加到NSRunLoop的addTimer方法。我个人更喜欢只调用NSTimer的scheduledTimerWithTimeInterval,因为它只需一次性完成所有操作。
来自NSTimer docs:
调用此方法请求从当前删除计时器 运行循环;因此,您应该始终调用invalidate方法 来自安装计时器的同一个线程。无效 计时器立即禁用它,以便它不再影响运行 环。然后运行循环移除并释放计时器 在invalidate方法返回之前或稍后的某个时间点。一旦 无效,计时器对象无法重复使用。