如何使用NSTimer
问题描述:
在我的应用程序中使用了很多定时器。对于录制时间,移动物体,褪色等,我使用相同的定时器在不同时间在同一视图中的几个puposes。我应该如何正确声明和无效或释放我的计时器?如何使用NSTimer
大气压林宣布这样的计时器:
fadeTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(bortInfo) userInfo:nil repeats:YES];
,并尽快即时不使用即时通讯这样做:
[fadeTimer invalidate];
fadeTimer = nil;
保留计数时,即时通讯留下的看法是0每计时器。我是否应该在dealloc中释放计时器?我的应用运行的很好,但不时崩溃。
,我使用的更新标签与时间clockTimer使用
[[NSRunLoop mainRunLoop] addTimer:clockTimer forMode:NSRunLoopCommonModes];
我是否需要一次我无效clockTimer做任何与此主循环?
总之请支持我一些关于定时器的信息。
非常感谢!
乔金 -
答
你没有正确留住计时器 - 如果你想引用他们再次,你应该留住他们。我做这在你的头一个属性,即文件
@property (nonatomic, retain) NSTimer *fadeTimer;
,改变你的代码说
self.fadeTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(bortInfo) userInfo:nil repeats:YES];
// Put this whenever you want to remove your timer and in your dealloc method.
[fadeTimer invalidate];
self.fadeTimer = nil;
这将确保您的定时器由你的对象保留。否则,你只需要希望计时器停留在周围并且不会被iPhone自动发布。如你所说它偶尔会崩溃,这可能是原因;)
恐怕我对运行循环不太了解,但很困惑为什么你不只是使用正常的NSTimer
来安排事情 - 为什么麻烦与运行循环进行交互?
答
- 计划的计时器由运行循环保留,并保留其目标。如果你想保留定时器,你必须通过几个循环来防止保留周期(我写了一个非保留的代理类,这有点麻烦,但它的工作原理)。
- 除非你知道你在做什么(我不知道),否则不要操作运行循环。 “计划”计时器已添加到主运行循环中。如果你像fadeTimer一样生成clockTimer,那么它会被添加到运行循环两次。
- “它不时崩溃”并不会帮助任何人。在调试器中运行它并查看它崩溃的位置。如果幸运的话,它甚至可能会向控制台发送一些消息。
答
*also you can use and this is a better and optimize way to write this line
if (theTimer != nil) {
if([theTimer isValid]){
[theTimer invalidate];
}
theTimer = nil;
}*
不完全正确;运行循环会保留“预定”计时器。 – 2010-08-09 18:54:22
非常真实,但我不知道如何计划定时器行为与长时间超时或内存不足的情况下等等 - 更安全比抱歉! – deanWombourne 2010-08-10 10:14:15