2012-02-09 192 views
0

http://www.youtube.com/watch?v=5al6qqRzzQg当我点击开始超过一次? 将我需要做什么这个NSTimer为什么会崩溃?

#import "FirstViewController.h" 

@implementation FirstViewController 

-(IBAction)start;{ 

    myticker = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showActivity) userInfo:nil repeats:YES]; 
} 
-(IBAction)stop;{ 

    [myticker invalidate]; 
} 
-(IBAction)reset;{ 

    time.text = @"0"; 
} 
-(void)showActivity;{ 

    int currentTime = [time.text intValue]; 
    int newTime = currentTime + 1; 
    time.text = [NSString stringWithFormat:@"%d", newTime]; 
} 


- (void)didReceiveMemoryWarning 
+0

-1:没有崩溃日志。没有错误描述。该视频甚至没有崩溃。 – 2012-02-09 15:52:27

+1

如果你真的阅读代码,问题很明显。 – 2012-02-09 15:53:56

回答

0

更改您的启动和停止的方法是:

-(IBAction)start;{ 

    [myticker invalidate]; 
    myticker = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showActivity) userInfo:nil repeats:YES]; 
} 

-(IBAction)stop;{ 

    [myticker invalidate]; 
    myticker = nil; 
} 

这将阻止它崩溃。此外,您应该添加此:

-(void)dealloc 
{ 
    [myticker invalidate]; 
} 
+0

喜交配感谢,因为它的工作原理,但是我做了 - (void)dealloc { [myticker invalidate]; }它有什么作用? – user1196885 2012-02-09 15:40:49

+0

只是把它放在你的视图控制器中。它确保当你的视图控制器被释放时,你的计时器不会继续。 – 2012-02-09 15:51:33

+0

是的,你需要在这种情况下使计时器无效。但不,你不需要在dealloc中添加'[myticker invalidate]'。这是毫无意义的。由于定时器保留了目标,因此您将永远不会进入dealloc,直到它有效。换句话说,dealloc被调用的事实意味着保留计数为零,因此计时器已经失效。 – Davyd 2013-07-03 06:35:39

0

一个布尔变量添加到您的类的头,像timerIsActive

-(IBAction)start;{ 
if (!timerIsActive) { 
    myticker = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(showActivity) userInfo:nil repeats:YES]; 
    timerIsActive = YES; 

} 
} 

-(IBAction)stop;{ 
    timerIsActive = NO; 
    [myticker invalidate]; 
} 
+0

@implementation FirstViewController - (IBAction为)启动; { 如果(timerIsActive){ myticker = [的NSTimer scheduledTimerWithTimeInterval:1.0目标:自选择器:@selector(showActivity)USERINFO:无重复:YES]; timerIsActive = YES; } } -(IBAction)stop; { timerIsActive = NO; [myticker invalidate]; } - (IBAction)reset; { time.text = @“0”; } - (void)showActivity; { – user1196885 2012-02-09 15:20:43

+0

它现在说未申报的标识符? – user1196885 2012-02-09 15:21:53