UINavigationController和UIViewController dealloc

Juk*_*rpa 3 memory iphone uiviewcontroller uinavigationcontroller dealloc

我最近改变了我的应用程序以使用UINavigationController,之前我使用的是UINavigationBar,使用级联子视图添加,这有点脆弱.

我正面临内存使用问题.泄漏工具没有显示任何泄漏,但我创建并添加到UINavigationController的ViewControllers似乎永远不会被释放.因此,每当我创建一个新的VC然后按下NavigationController的后退按钮时,内存使用量就会增加.

我只需这样创建并添加我的VC:

DetailViewController* detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
// setups
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
Run Code Online (Sandbox Code Playgroud)

该应用程序永远不会通过ViewController deallocviewDidUnload方法.每次按下后退按钮时,不应该调用这些吗?

我搜索了许多教程并阅读了Apple的内存管理,但是在使用NavigationController时,VC的内存生命周期并不存在.

Buj*_*uju 5

也许你没有做错事,而是你面对的是这样的事情

在博客文章中,我们是否必须手动释放IBOutlets是一个问题.事实证明我们应该.这在iOS 3.1.3中是可重现的,但我还没有在iOS 4.0中测试它.

第二个方法是覆盖视图控制器保留和释放方法并打印出保留计数.我有一个类似的问题,一些视图控制器dealloc方法没有调用,所以我重写这个方法,看看有人仍然保留它.事实证明它确实如此.

编辑:
当我打印我的保留计数时,它有时会达到〜98由框架引起,所以这并不是真的要担心.

如果你的最后一次保留计数保持为2并且不会调用dealloc方法,那么还有一个人仍然保留了它.

在这种情况下,您应该搜索其他地方.

例如,我在同一个问题中遇到的另一个问题:有时我会使用

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateUI) userInfo:nil repeats:YES]

不断更新UI.但我忘记的是,NSTimer将保留目标对象(即ViewController).因为NSTimer保留了您的视图控制器,所以永远不会调用dealloc,因为有人(NSTimer)仍然保留它.因此,您必须确保使NSTimer BEFORE dealloc方法无效以正确释放视图控制器.

编辑2以回应下面的评论:
保留声明的属性如下(例如):

- (void)setTarget:(id)value {
  if (value != target) { 
    [target release];
    target = [value retain];
}
Run Code Online (Sandbox Code Playgroud)

所以它首先释放你当前的self.target然后保留新值.由于你指定的是nil,你的目标之后将是零.有关属性的更多信息,请参阅Apple文档.