1

在过去的几天里,我试图调查我最近发现的非常奇怪的情况。popViewControllerAnimated:问题是推送的控制器在通话后看起来还活着。我创建了一个简单的测试项目(启用了 ARC),其中两个控制器嵌入在根导航控制器中,并且该行为已被重现。 在此处输入图像描述 这是触发第二个控制器的第一个 viewController 代码:

-(IBAction)push:(id)sender {
    [self performSegueWithIdentifier:@"vseg" sender:nil];
}

从我的角度来看,没有什么不寻常的。第二个控制器中有一个方法,每秒由计时器调用:

-(void) ticker {
    NSLog(@"from ViewController2 %d", tickerCount++);
    _counterLabel.text = [NSString stringWithFormat:@"tick: %d", tickerCount];
    [self performSelector:@selector(ticker) withObject:nil afterDelay:1];
}

仍然没有什么异常 - 应用程序按预期工作,UILabel 更新,tickerCount 值增加,并且消息出现在控制台上。接下来我们点击返回按钮,第一个控制器被弹出并且控制台继续从第二个控制器接收消息。 在此处输入图像描述

我仍然不知道它实际上是什么意思?整个控制器是否保持未发布或只是由某些对我没有意义的 clousure 变量持有的ticker 方法。这是测试项目http://hxml.ru/EliEX

4

1 回答 1

1

取消选择器只需使用

[NSObject cancelPreviousPerformRequestsWithTarget:self];

或者

[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]

performSelector:afterDelay:目标是调用的原始对象

- (void)viewWillDisappear:(BOOL)animated
{
   [NSObject cancelPreviousPerformRequestsWithTarget:self];
}

参考Run LoopsNSObject文档

于 2013-12-16T10:25:58.820 回答