弹出视图时(使用 UINavigationController)使 NSTimer 无效并释放

Posted

技术标签:

【中文标题】弹出视图时(使用 UINavigationController)使 NSTimer 无效并释放【英文标题】:Invalidate and release an NSTimer when popping a view (with a UINavigationController) 【发布时间】:2011-07-13 15:45:31 【问题描述】:

我正在使用 UINavigationController:在我的第一个视图中,有一个 UIButton 使用此代码推送另一个视图

- (IBAction)gototrack:(id)sender 
    map *map2 = [[map alloc] initWithNibName:@"map" bundle:[NSBundle mainBundle]];
    [self.navigationController pushViewController:map2 animated:YES];
    [map2 release];

在第二个视图中,有一张地图,指示对象的位置。 这个对象移动得很快,所以我需要每秒刷新一次位置:我正在使用 NSTimer 执行此操作,它调用计算新坐标并刷新地图的方法。 好的,一切正常,但是当用户弹出视图(使用 NavigationBar 中的常用按钮)时,无法释放第二个视图,因为 NSTimer 仍在工作!

当用户弹出第二个视图时,我该怎么做才能使 NSTimer 无效并释放? 是否有一些自动调用的方法? (我试过了,但没有)

谢谢!

【问题讨论】:

【参考方案1】:

您可以尝试使-viewWillDisappearviewDidDisappear 中的NSTimer 无效。

viewWillDisappear:

当视图从其窗口中移除或被另一个视图覆盖时调用此方法。在实际移除或覆盖视图之前以及配置任何动画之前调用此方法。

子类可以覆盖此方法并使用它来提交编辑更改、退出视图的第一响应者状态或执行其他相关任务。例如,您可以使用此方法恢复对第一次呈现视图时在 viewDidDisappear: 方法中对状态栏的方向或样式所做的更改。如果你重写了这个方法,你必须在你的实现中调用 super。

查看UIViewController reference了解更多详情。

【讨论】:

【参考方案2】:

很简单,就是这样:[//Your nstimer// invalidate];

【讨论】:

并且在这种情况下,只要您需要它发生,您就可以这样做 viewDidDissapear

以上是关于弹出视图时(使用 UINavigationController)使 NSTimer 无效并释放的主要内容,如果未能解决你的问题,请参考以下文章

UITabbar 与 UINavigation Controller 视图重叠

弹出其他视图控制器时如何更改弹出视图大小

弹出视图时(使用 UINavigationController)使 NSTimer 无效并释放

使用导航控制器弹出视图控制器时释放内存的问题

不使用导航控制器时弹出视图控制器?

关闭弹出视图