NSTimer不会失效

时间:2012-07-07 16:22:13

标签: objective-c cocoa-touch nstimer

这里的代码不多,但这个问题严重让我感到烦恼!

·H:

@interface processController : UIViewController {
         NSTimer *timer;
}
@property (nonatomic, retain) NSTimer *timer;

的.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector (main) userInfo:nil repeats:YES];
}
- (void)main {
    NSLog(@"testing");
}
- (void)viewDidUnload {
    [self.timer invalidate];
    self.timer = nil;
}

奇怪的是,当我解雇这段代码时:

ViewController *main = [[ViewController alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:main animated:YES];

并切换视图,计时器一直开火!我做错了什么?

1 个答案:

答案 0 :(得分:5)

当视图从屏幕上移除时,

viewDidUnload不会被调用,而当应用程序收到内存警告时,。当UIViewController被释放时也不会调用它。来自Apple的文档:

  

当出现内存不足的情况和当前视图控制器时   如果不需要视图,系统可能会选择从中删除这些视图   记忆。在视图控制器的视图之后调用此方法   已经发布,你有机会进行任何最后的清理工作。如果你的   视图控制器存储对视图或其视图的单独引用   子视图,您应该使用此方法来释放这些引用。您   也可以使用此方法删除对您的任何对象的引用   创建以支持视图但现在不再需要了   观点消失了。您不应该使用此方法来释放用户数据或   任何其他无法轻易重建的信息。

您很可能打算使用viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.timer invalidate];
    self.timer = nil;
}   

您可能希望在viewWillAppear中启动计时器:因为只要访问控制器的view属性就会调用viewDidLoad。显示视图时并不是必然的。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(main) userInfo:nil repeats:YES];
}

我建议阅读viewDidLoad和viewDidUnload的讨论以及UIViewController documentation中的viewWillAppear和viewWillDisappear。