如何使用NSTimer

时间:2010-08-09 12:27:10

标签: iphone xcode ipad nstimer

我在我的应用程序中使用了很多计时器。对于录制时间,移动物体,褪色等我在不同时间在同一视图中使用相同的计时器。我应该如何正确地宣布和宣布我的计时器?

Atm Im宣布这样的计时器:

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无效,我是否需要对此mainLoop做任何事情?

总而言之,请向我提供有关与计时器合作的一些信息。

非常感谢!

乔金姆

3 个答案:

答案 0 :(得分:7)

你没有正确地保留你的计时器 - 如果你想再次参考它们你应该保留它们。我会使用属性(即头文件

)执行此操作
@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来安排事情 - 为什么还要干扰与运行循环的交互呢?

答案 1 :(得分:3)

  • 计划的计时器由运行循环保留,并保留其目标。如果你想保留计时器,你必须跳过一些箍以防止保留周期(我写了一个非保留的代理类,这有点乱,但它有效)。
  • 除非你知道自己在做什么(我不知道),否则不要操纵运行循环。 “预定”计时器已添加到主运行循环中。如果您正在生成像fadeTimer这样的clockTimer,那么它会被添加到运行循环中两次。
  • “不时崩溃”对任何人都没有帮助。在调试器中运行它,看看它崩溃的地方。如果你幸运的话,它甚至可能会向控制台打印一些消息。

答案 2 :(得分:-1)

*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;
    }*