【发布时间】:2010-02-02 22:04:25
【问题描述】:
我在启动和停止 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 方面的任何帮助。
【问题讨论】:
-
我认为与您的崩溃无关,但您可能不想检查浮点数是否明确相等。
-
你将如何完成这项任务?检查 (battVoltage > 24)?
-
这是一个更好的方法,是的。
标签: objective-c cocoa nstimer