iphone - UINavigationController 和 UIViewController 释放

标签 iphone memory uiviewcontroller uinavigationcontroller dealloc

我最近更改了我的应用程序以使用 UINavigationController,之前我使用的是 UINavigationBar,添加了级联 subview ,这有点脆弱。

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

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

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

应用程序永远不会执行 ViewController 的 deallocviewDidUnload 方法。每次我按后退按钮时不应该调用这些吗?

我查了很多教程,也看了Apple的内存管理,但是没有任何关于使用NavigationController时VC在内存中的生命周期的内容。

最佳答案

也许您没有做错什么,而是面临类似 this 的情况。

博客文章中提出了我们是否必须手动释放 IBOutlets 的问题。事实证明我们应该这样做。这在 iOS 3.1.3 中是可以重现的,但我还没有在 iOS 4.0 中进行测试。

第二种方法是重写 View Controller 的保留和释放方法并打印出保留计数。我有一个类似的问题,一些 View Controller 的 dealloc 方法没有调用,所以我重写这个方法来看看是否有人仍然保留它。事实证明确实如此。

编辑:
当我打印保留计数时,由于框架的原因,它有时会达到 ~98,所以不必担心。

如果你最后的保留计数保持在 2 并且 dealloc 方法不会被调用,那么有人仍然保留它。

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

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

[NSTimerchedTimerWithTimeInterval:1.0 目标:self 选择器:@selector(updateUI) userInfo:nil 重复:YES]

不断更新用户界面。但我忘记的是,NSTimer 将保留 target 对象(即 ViewController)。因为 NSTimer 保留了你的 View Controller ,所以你的 dealloc 永远不会被调用,因为某人(NSTimer)仍然保留它。因此,您必须确保在 dealloc 方法之前使 NSTimer 无效才能正确释放 View Controller 。

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

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

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

关于iphone - UINavigationController 和 UIViewController 释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3230230/

相关文章:

iphone - addSubview 和 removeFromSuperview 时的堆增长

c - 如何在C/C++中将二维数组的指针赋给内存地址

python - 如何测量给定时刻的进程内存使用情况

iphone - 执行pushViewController 是否需要UINavigationController?

iphone - 如何在另一个 UIView Controller 中显示复杂的 UIViewController?

iphone - 是否可以扩展Matt Gallagher的AudioStreamer框架以播放MP3以外的其他格式?

iphone - 使用 CFDictionaryCreate 和特殊字符创建 CFDictionaryRef

ios - 从核心数据中获取数据

windows - 如何从 Windows 应用程序内存中读取一些数据?

ios - UINavigationController 作为 iPhone 上的弹出窗口?