代码之家  ›  专栏  ›  技术社区  ›  Jukurrpa

UINavigationController和UIViewController解除锁定

  •  3
  • Jukurrpa  · 技术社区  · 14 年前

    我最近把我的应用程序改成使用UINavigationController,我以前用的是UINavigationBar,加了cascade子视图,有点脆弱。

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

    我只是这样创建和添加我的风投:

    DetailViewController* detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    // setups
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
    

    应用程序从不通过ViewController的 dealloc viewDidUnload 方法。我每次按后退键都应该叫这个吗?

    我已经搜索了很多教程并阅读了苹果的内存管理,但是没有关于VC在使用NavigationController时的内存寿命的任何信息。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Buju    14 年前

    this

    在博客文章中,问题是我们是否必须手动释放IBOutlets。事实证明我们应该这样做。这是可复制的iOS3.1.3,但我没有测试它在iOS4.0尚未。


    当我打印我的retain count时,它有时会达到~98,这是由框架引起的,所以不必担心。

    在这种情况下,你应该搜索其他地方。

    例如,我在这个问题中遇到的另一个问题:

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

    不断更新用户界面。但我忘了的是,NSTimer将保留 对象(它是ViewController)。因为NSTimer保留了您的视图控制器,所以您的dealloc将永远不会被调用,因为有人(NSTimer)仍然保留在它上面。因此,您必须确保在dealloc方法之前使NSTimer无效,才能正确地释放视图控制器。

    Edit2回应如下评论:
    保留声明的属性如下(exsample):

    - (void)setTarget:(id)value {
      if (value != target) { 
        [target release];
        target = [value retain];
    }
    

    因此,它首先释放当前self.target,然后保留新值。因为你分配的是零,你的目标将是零。关于属性的更多信息可以在Apple文档中找到。

        2
  •  2
  •   Jason McCreary    14 年前

    我也见过这个。正如你所指出的,我还没有在文档中看到任何明确的内容,但我相信它们会被保留在内存中,直到需要内存为止。从性能的角度来看,这样做是有意义的,因为这样做可以让应用程序在不同的视图之间快速导航。

    底线是,我不会担心的。你可以发射一些 内存不足警告