2012-05-02 33 views
0

一组简化的方法来证明发生了什么:的NSTimer无效 - 重复计时器

- (void)timerDidFire { 
    NSLog(@"fire"); 
} 

- (void)resetTimer:(NSTimer *)timer { 
    if (timer) [timer invalidate]; // timer = nil; here doesn't change anything 
    NSLog(@"%@", timer); 
    timer = [NSTimer ...Interval:1 ... repeats:YES]; 
} 

- (IBAction)pressButton { 
    [self resetTimer:myTimer]; 
} 

结算我做错了什么,但什么?为什么每次印刷都会有额外的计时器?

回答

2

每次调用resetTimer:方法时,都会创建一个新的NSTimer实例。不幸的是,在完成此方法的执行后,您将失去对新实例的所有引用,因为它已分配给本地变量。
您在该方法内创建的计时器未分配给myTimer变量。无论myTimer是什么,它都不是新创建的计时器。

,你可以放弃所有的局部变量和简单的使用是这样的:

- (void)resetTimer { 
    [myTimer invalidate]; // calls to nil are legal, so no need to check before calling invalidate 
    NSLog(@"%@", myTimer); 
    myTimer = [NSTimer ...Interval:1 ... repeats:YES]; 
} 

- (IBAction)pressButton { 
    [self resetTimer]; 
} 
+0

我想这可能是类似的东西。愚蠢的错误。不知道为什么我认为局部变量会做任何事情。 – Thromordyn