0

问题是停止 NSTimer,由于某种原因 [Timer invalidate] 只是不工作......

可能我的眼睛里全是肥皂,但是不明白为什么定时器没有停在0,而是倒数-1、-2、-3等等……(((

我使用纪元数字作为目的地日期。还有一件事-我的带有[Timer invalidate]的按钮“IBAction stop”工作得很好-当我在模拟器中按下它时计时器停止...

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];


Timer = [NSTimer  scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];

}

- (IBAction) start {

Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];


}
- (IBAction) stop {

[Timer invalidate];
Timer = nil;

}

-(void)updateLabel {

NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
int units = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *components = [calender components:units fromDate:[NSDate date] toDate:destinationDate options:0];
[dateLabel setText:[NSString stringWithFormat:@"%d%c  %d%c  %d%c  %d%c", [components day], 'd', [components hour], 'h', [components minute], 'm', [components second], 's']];

destinationDate = [NSDate dateWithTimeIntervalSince1970:1355299710];

if (!destinationDate) {

    [Timer invalidate];
    Timer = nil;
}
}
4

1 回答 1

0

正如 Totumus 所指出的,您的if语句条件!destinationDate始终评估为 false,因此您的updateLabel方法永远不会使您的计时器无效。

您还有另一个错误:

您正在创建一个计时器viewDidLoad并将对它的引用存储在您的Timer实例变量中。

然后,您将在其中创建另一个计时器start并将对它的引用存储在您的Timer实例变量中,覆盖对您创建的计时器的引用,viewDidLoad而不会使旧计时器无效。

因此,现在您有两个计时器正在运行,但您没有对旧计时器的引用,因此您永远不能使其无效。

请注意,运行循环对计划(运行)计时器有强引用,因此即使您删除了对它的所有强引用,计时器也会继续运行。这就是invalidate消息存在的原因:告诉运行循环删除其对计时器的强引用。

于 2012-12-12T08:37:59.640 回答