我正在复制我的代码,所以我重写了这样:
-(void) dealloc {
[self resetTimer];
[super dealloc];
}
-(void) resetTimer {
if( timer != nil ) {
[timer invalidate];
}
timer = nil;
// set some other value to zero...
}
在dealloc方法中调用此resetTimer方法是否可以接受?否则我最终会在resetTimer中写两次相同的4行。
答案 0 :(得分:4)
@mackworth说:
-(void) resetTimer {
[timer invalidate];
timer = nil;
}
但是,您没有显示计时器的创建。如果是这样的话:
timer = [[NSTimer scheduledTimerWithTimeInterval: 42 target:self ...] retain];
然后你的对象的dealloc
永远不会被调用。至少,不是没有代码中的过度发布错误。
计时器保留其目标。因此,如上创建的计时器将在对象和计时器之间创建一个保留周期。
一种解决方案是在您希望计时器停止时显式调用resetTimer
(我称之为invalidateTimer
,因为重置意味着您正在重置计时器以继续运行)。
另一个是不保留计时器而不在dealloc
中释放它。看起来有点不稳定,但有时你必须玩这类弱参考游戏。
答案 1 :(得分:0)
我做了同样的事情,它对我来说很好。 (虽然我确实依赖于零号码,但它只是:)
-(void) resetTimer {
[timer invalidate];
timer = nil;
}