我使用了一些计时器,希望用户能够在完成之前取消它,或者在完成后将其从视图中删除。这两件事都应该由cancelAction方法处理。如果计时器还没有完成,则cancelAction中的if语句告诉计时器无效,使它们为零并删除显示剩余时间的视图。这非常有效。如果计时器已经完成,则cancelAction仅删除视图,并且不会尝试使它们无效。但这似乎不起作用。如果我在完成之前取消,一切正常,如果我在完成后取消,它会抛出一个异常,说无法识别的选择器发送到实例。两个计时器都是使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
方法
在完成之前或之后调用之间的区别在于,如果它们完成,则运行此方法。
- (void)timerFinished:(id)sender {
[timer invalidate];
timer = nil;
[timerLabelUpdater invalidate];
timerLabelUpdater = nil;
}
这是奇怪的地方。如果我只是删除[timerLaberUpdater invalidate]
,则会调用该方法并将其删除。我不想删除该行,因为该计时器会减少剩余时间并使用剩余时间更新视图。如果我没有使它失效,它会继续计数到负数,再加上它占用内存。
我真诚地不知道为什么删除该行会改变任何内容,两个定时器都以相同的方式被调用,如果我删除另一行,它仍然无法工作,只需删除该指令就会发生任何变化。
我在gdb中获得了EXC BAD ACCESS,我认为这意味着选择器被发送到已发布的实例。
感谢您的帮助。
答案 0 :(得分:0)
if([timerLabelUpdater isValid])
[timerLabelUpdater invalidate];