NSTimer不会停止

use*_*789 2 iphone objective-c nstimer ios

     [self performSelectorInBackground:@selector(method) withObject:nil];

    -(void)method 
    {
    timer1 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(getLastImageName1) userInfo:nil repeats:YES];
                runLoop = [NSRunLoop currentRunLoop];
                [runLoop addTimer:timer1 forMode:NSRunLoopCommonModes];
                [runLoop run];
    }

-(void)viewdidunload
{
  [timer1 invalidate];
  timer1=nil;
}
Run Code Online (Sandbox Code Playgroud)

我开始TimerHomeViewController连我无效,它一直在运行OtherViewController.我的代码出了什么问题?

nhg*_*rif 12

首先,当您重写生命周期方法时,应该包括super对该方法版本的调用.

其次,Objective-C是区分大小写的,所以即使你的应用程序试图甚至调用生命周期viewDidUnload,你的方法也永远不会被调用,因为那就是你的方法.

第三,在iOS 6.0中viewDidUnload弃用了,除非你想要支持向后兼容性,否则不应该在这一点上使用它.它永远不会在iOS 6.0及更高版本中调用.


如果您希望计时器在用户导航离开当前视图时停止,您将需要以下内容:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    if (timer1.isValid) {
        [timer1 invalidate];
    }
    timer1 = nil;
}
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找其他东西,您需要详细说明您想要完成的内容.


如果您正在处理iOS 6.0之前的项目,无论出于何种原因,您的方法未被调用的原因至少部分是因为拼写错误.Objective-C再次区分大小写.您的方法名称应拼写viewDidUnload.


为了将来参考,问题不应该是"为什么我的计时器无效?" 您应该首先使用断点或NSLog语句来确定viewdidunload尝试使计时器无效的方法是否会触发.当你发现它没有被调用时,请搜索一下"如何调用viewdidunload?" 那么你将解决大写问题,问题将(可能)仍然存在,所以做更多的研究.如果最后,你仍然无法弄明白,作为最糟糕的情况,帖子问题应该是"怎么没有调用viewdidunload?"