无法无效,停止倒计时NSTimer - 目标C.

时间:2012-12-12 08:23:06

标签: objective-c ios nstimer xcode4.5 invalidation

问题是停止NSTimer,由于某种原因[计时器无效]只是不工作......

也许我的眼睛充满了肥皂,但是无法理解为什么计时器没有停在0,而是反向计数-1,-2,-3等等......((< / p>

我正在使用纪元号作为目的地日期。还有一件事 - 我的按钮“IBAction stop”与[Timer invalidate]工作正常 - 当我在模拟器计时器停止时按下它...

@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;
}
}

1 个答案:

答案 0 :(得分:0)

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

你还有另一个错误:

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

然后你在start创建另一个计时器并在Timer实例变量中存储对它的引用,覆盖你在{{{ 1}}而不会使旧计时器失效。

所以现在你有两个计时器在运行,但你没有对旧计时器的引用,所以你永远不会让它失效。

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