我正在尝试运行下面的代码,但是在将“滴答”写入控制台后,它一直锁定模拟器。它从不输出“ Tock”,所以我的猜测是它与“ NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];”行有关。 IB操作通过按钮激活。 .h中将timer和startTime分别定义为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

最佳答案

您在哪里:

startTime = [NSDate date];


你需要:

startTime = [[NSDate date] retain];


任何没有分配的新的init创建的东西都将被自动释放(经验法则)。因此,正在发生的事情是创建NSDate,将其分配给startTime,它会自动释放(销毁),然后尝试在完全释放的对象上调用timeIntervalSinceNow,这样它就会崩溃。

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

关于cocoa - NSTimer故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1541219/

10-11 19:29