我正在尝试运行下面的代码,但是在将“滴答”写入控制台后,它一直锁定模拟器。它从不输出“ 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/