【发布时间】:2011-11-17 18:40:20
【问题描述】:
----我自己解决的问题,我的评论中更新了信息----
我有一个具有周期性 NSTimer 的视图控制器。当我删除视图控制器时,我调用计时器无效:
- (void)dealloc
{
NSLog(@"dealloc called");
if ([myTimer isValid]) {
[myTimer invalidate];
}
[super dealloc];
}
我发现 [myTimer invalidate] 将立即调用我的视图控制器的 dealloc 的意外行为。这就是我放置 isValid 检查以避免崩溃的原因。但是 [super dealloc] 将被调用两次并导致应用程序崩溃。
因此,我有两个问题:
使计时器无效的正确方法是什么?
为什么定时器的invalidate方法会调用视图控制器的dealloc方法?
谢谢
狮子座
【问题讨论】:
-
您应该在 viewDidUnload 下放置 invalidate 语句以避免崩溃。
-
这听起来有些奇怪。是否有任何其他对象保留对您的视图控制器的引用 - 如果没有,是否有可能一旦定时器从
NSRunLoop删除并释放,视图控制器就没有任何引用它了(因此被释放)? -
@studev,你是对的。我只是认为视图控制器在这段代码之外被错误地释放了。计时器的无效将释放目标,但不应调用目标的 dealloc。相反,保留计数应该从 2 减少到 1。因为当我安排计时器时,计时器保留了目标。
-
好的,很高兴听到 - 我会添加我的评论作为答案。
标签: iphone objective-c cocoa-touch ipad nstimer