----问题由我自己解决,信息在我的评论中更新----
我有一个具有定期NSTimer的视图控制器。我调用计时器的无效当我删除视图控制器时:
- (void)dealloc
{
NSLog(@"dealloc called");
if ([myTimer isValid]) {
[myTimer invalidate];
}
[super dealloc];
}
我发现了一个意外的行为,[myTimer invalidate]将立即调用我的视图控制器的dealloc。这就是为什么我把isValid检查以避免崩溃。但是[super dealloc]将被调用两次并崩溃应用程序。
因此,我有两个问题:
使计时器无效的正确方法是什么?
为什么计时器的invalidate方法调用视图控制器的dealloc方法?
由于
利奥
答案 0 :(得分:3)
以下是一些可以帮助您使用NSTimer的规则:
计时器保留target和userInfo对象。
计划时,运行循环会自动保留计时器。
如果计时器没有设置为重复,它将在触发时自动使其自动失效。
调用invalidate时,计时器从运行循环中释放。
计时器在调用invalidate时释放目标和userInfo对象。
换句话说,如果释放重复计时器而不使其失效,它将继续重复,因为运行循环保留它。但是,如果您不想在应用程序退出之前停止计时器,或者计时器不重复,则可以在安排计时器后将其释放而不调用invalidate。
答案 1 :(得分:1)
这听起来像是一些奇怪的行为。是否还有其他对象持有对视图控制器的引用?
如果没有,有可能一旦取下定时器&从运行循环中释放出来的视图控制器不再引用它(因此被解除分配)。