1

这里的代码不多,但这个问题让我很恼火!

。H:

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

米:

- (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];

并切换视图,计时器不断触发!我究竟做错了什么?

4

1 回答 1

5

viewDidUnload当视图从屏幕上移除时不会调用,但只有在应用程序收到内存警告时才会调用。UIViewController 被释放时也不会调用它。来自 Apple 的文档:

当内存不足的情况发生并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。此方法在视图控制器的视图被释放后调用,这是您执行任何最终清理的机会。如果您的视图控制器存储了对视图或其子视图的单独引用,您应该使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但在视图消失后不再需要的任何对象的引用。您不应使用此方法发布用户数据或任何其他无法轻松重新创建的信息。

您很可能打算使用viewWillDisappear

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

您可能希望在 viewWillAppear 中启动计时器:因为一旦访问控制器的视图属性,就会调用 viewDidLoad。显示视图时不一定。

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

我建议阅读UIViewController 文档中关于 viewDidLoad 和 viewDidUnload 以及 viewWillAppear 和 viewWillDisappear 的讨论。

于 2012-07-07T16:25:43.860 回答