这个NSTimer dealloc是可接受的还是会产生意外错误?

时间:2011-02-18 00:42:13

标签: iphone objective-c nstimer

我正在复制我的代码,所以我重写了这样:

-(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行。

2 个答案:

答案 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;
}