【发布时间】:2012-02-13 07:34:36
【问题描述】:
所以基本上,我有这个计时器,当它收到一个按键事件时应该重复这个计时器,并在用户释放按键时失效。但是,即使在 NSRunLoop 中调用addTimer:forMode:,我也无法“验证”计时器。有谁知道为什么会这样以及我该如何解决这个问题?谢谢。
【问题讨论】:
标签: objective-c cocoa nstimer nsrunloop
所以基本上,我有这个计时器,当它收到一个按键事件时应该重复这个计时器,并在用户释放按键时失效。但是,即使在 NSRunLoop 中调用addTimer:forMode:,我也无法“验证”计时器。有谁知道为什么会这样以及我该如何解决这个问题?谢谢。
【问题讨论】:
标签: objective-c cocoa nstimer nsrunloop
您不能使用无效的计时器。
来自 Apple 文档:
一旦安排在运行循环上,计时器就会在指定的时间触发 间隔,直到它失效。非重复计时器无效 自己开火后立即。但是,对于重复计时器,您 必须自己通过调用其 invalidate 来使计时器对象无效 方法。调用此方法请求从 当前运行循环;因此,您应该始终调用 invalidate 来自安装计时器的同一线程的方法。 使计时器无效会立即将其禁用,使其不再 影响运行循环。然后运行循环删除并释放 计时器,在 invalidate 方法返回之前或某个时间 稍后点。一旦失效,定时器对象就不能被重用。
【讨论】:
一旦你使一个 NSTimer 失效,你不应该再使用它。
相反,创建一个新的计时器实例,并使用该实例添加到 NSRunLoop 的 addTimer 方法。就我个人而言,我更喜欢调用 NSTimer 的 scheduleTimerWithTimeInterval,因为它可以一次性完成所有操作。
来自 NSTimer docs:
调用此方法请求从当前的定时器中删除 运行循环;因此,您应该始终调用 invalidate 方法 来自安装计时器的同一线程。无效 计时器立即将其禁用,使其不再影响运行 环形。然后运行循环删除并释放计时器,或者只是 在 invalidate 方法返回之前或稍后的某个时间点。一次 无效,定时器对象不能被重用。
【讨论】: