此处代码:
timer1 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(getLastImageName) userInfo:nil repeats:YES];
runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer1 forMode:NSRunLoopCommonModes];
[runLoop run];
当用户按错了选项时,此计时器会触发警报。点击警告确定按钮,我停止计时器并runloop
。如果用户没有点击确定按钮而是按下iPhone主页按钮,计时器会停止吗?
答案 0 :(得分:4)
计时器没有"运行"在你思考的方式。没有"倒计时。"计时器只是在运行循环中添加一个标记,以便在特定时间发送某个消息。每次runloop运行时,它会检查是否有任何定时器已过期(如果"现在"是否晚于他们的开火日期)。如果是这样,它以与调用drawRect:
之类的其他内容相同的方式发送所请求的消息,或者处理触摸事件等。它或多或少是一个巨大的while (true)
循环,其中循环中的一个东西是"火过期的计时器。"
那么所有这些意味着什么呢?这意味着定时器只有在给定的回路被泵送时才会触发" (处理)。通常这是主runloop,它只在您的应用程序处于活动状态时进行处理。如果您变为非活动状态(通常在用户导航到另一个应用程序时),则runloop不会处理。当您回来时,所有在您处于非活动状态时到期的计时器都会触发(这就是为什么您通常希望在进入后台之前使计时器无效的原因)。 (非主要的runloops有点复杂,但非常罕见。但它们仍然无法在后台无限期地运行,但是有更多的情况下它们无法运行。)
另一方面,如果你被终止(这可能会在你背后没有通知的情况下发生),那么你的runloops都会消失。重新启动时,您的计时器不会被实例化。如果你想要它,这就是你的工作。所以你不能依靠你的计时器开火。
由于您已加入repeats:YES
,系统会自动为您重新安排计时器。同样,这并不意味着它会倒计时#34;或者是#34;仍在运行"或类似的东西。它只是意味着当它触发时,它会自动安排另一个计时器事件。因此,如果用户只是坐在" OK"按钮足够长,计时器将再次启动(在iOS中;在Mac和"模式"在那里更重要的事情可能会有所不同。)
请注意,没有理由同时调用scheduledTimerWithTimeInterval:...
和addTimer:...
"已预定"方法的一部分意味着计时器已经添加到runloop。
答案 1 :(得分:0)
您的应用是在后台运行还是在后台暂停?
如果您尚未向info.plist添加多任务处理模式,您的应用将被暂停。计时器将暂停,直到用户恢复您的应用程序。
如果您添加了多任务处理模式并且符合要求(例如音频模式,并且您当前正在播放音频),那么您的应用仍会运行,包括其计时器。