NSTimer麻烦

时间:2009-10-09 00:05:20

标签: cocoa cocoa-touch nstimer

我正在尝试运行下面的代码但是在将“Tick”写入控制台后它会一直锁定我的模拟器。它从不输出“Tock”所以我的猜测是它与“NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];”这一行有关。 IBactions由按钮激活。 timer和startTime分别在.h中定义为NSTimer和NSDate。

谁能告诉我我做错了什么?

代码:

- (IBAction)startStopwatch:(id)sender
{
    startTime = [NSDate date];
    NSLog(@"%@", startTime);
    timer = [NSTimer scheduledTimerWithTimeInterval:1 //0.02
                                             target:self
                                           selector:@selector(tick:)
                                           userInfo:nil
                                            repeats:YES];
}

- (IBAction)stopStopwatch:(id)sender
{
    [timer invalidate];
    timer = nil;
}

- (void)tick:(NSTimer *)theTimer
{
    NSLog(@"Tick!");
    NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];
    NSLog(@"Tock!");
    NSLog(@"Delta: %d", elapsedTime);
}

我在.h中有以下内容:

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate> {

    NSTimer *timer;
    NSDate *startTime;
}


- (IBAction)startStopwatch:(id)sender;
- (IBAction)stopStopwatch:(id)sender;
- (void)tick:(NSTimer *)theTimer;

@property(nonatomic, retain) NSTimer *timer;
@property(nonatomic, retain) NSDate *startTime;

@end

2 个答案:

答案 0 :(得分:4)

你在哪里:

startTime = [NSDate date];

你需要:

startTime = [[NSDate date] retain];

使用alloc,new,init创建的任何内容都将自动释放(经验法则)。所以发生的事情是你正在创建NSDate,将它分配给startTime,它会自动释放(销毁),然后你试图在一个完全释放的对象上调用timeIntervalSinceNow,这样它就会爆炸。

添加保留会增加保留计数,因此在自动释放后它仍会保留。不过忘记在完成后手动释放它!

答案 1 :(得分:3)

要利用@property,您需要执行以下操作:    self.startTime = [NSDate date]