我正在尝试运行下面的代码但是在将“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
答案 0 :(得分:4)
你在哪里:
startTime = [NSDate date];
你需要:
startTime = [[NSDate date] retain];
使用alloc,new,init创建的任何内容都将自动释放(经验法则)。所以发生的事情是你正在创建NSDate,将它分配给startTime,它会自动释放(销毁),然后你试图在一个完全释放的对象上调用timeIntervalSinceNow,这样它就会爆炸。
添加保留会增加保留计数,因此在自动释放后它仍会保留。不过忘记在完成后手动释放它!
答案 1 :(得分:3)
要利用@property,您需要执行以下操作: self.startTime = [NSDate date]