我在启动和停止 NSTimers 时遇到问题。文档说计时器被 [timer invalidate] 停止;
我有一个这样声明的计时器对象
.h
NSTimer *incrementTimer;
@property (nonatomic, retain) NSTimer *incrementTimer;
.m
@synthesize incrementTimer;
-(void)dealloc {
[incrementTimer release];
[super dealloc];
}
-通常。
需要时,我的方法执行以下操作:
-(void)setGenCount {
if(!condition1 && condition2) {
incrementTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0
target: self
selector:@selector(incrementBatteryVoltage:)
userInfo: nil
repeats: YES];
}
}
上面的一切工作正常。但是,一旦那个计时器完成了它的工作,我希望它自己失效。我使计时器无效,因为可以调用一个相等的递减方法,如果它仍然处于活动状态,它将与 incrementTimer 对抗。(以前,我注意到我的两个计时器,如果处于活动状态,则通过增加和减少值(一种战斗)来作用于同一个 ivar ......而不会崩溃)调用的选择器的工作方式如下:
-(void)incrementBatteryVoltage:(NSTimer *)timer {
if(battVoltage < 24.0) {
generatorDisplay.battVoltage += 0.1;
}
if(battery1Voltage == 24.0) {
[timer invalidate];
}
}
我有一个相等的方法来减少电池计数。(前面提到)
由于我的程序设计:界面模拟了电压显示。当“机器”关闭时,我希望所有定时器都失效,不管电压值是多少。我通过检查计时器是否有效来做到这一点。
-(void)deEnergizeDisplays {
if([decrementTimer isValid]) {
[decrementTimer invalidate];
decrementTimer = nil;
}
if([incrementTimer isValid]) {
[incrementTimer invalidate];
incrementTimer = nil;
}
我遇到了许多“BAD_ACCESS”崩溃。错误的线路呼叫总是指向我的 [timer isValid] 呼叫。似乎如果计时器无效......指针也不存在。我知道 [timer invalidate] 消息会禁用计时器,然后将其从运行循环中删除,然后将其释放。我的理解是:根据它的命名约定,它是一个自动发布的对象。
我的想法是:如果我要发送保留消息,引用不应该仍然存在吗?我尝试了几种组合,带走了:
timer = nil;
甚至代替:
if([timer isValid])
我试过了 :
if([timer != nil])
和:
if(timer)
我总是遇到同样的崩溃。感谢您对启动和停止 NSTimers 的任何帮助。