【问题标题】:UINavigationController memory does not decrease when pop a controller弹出控制器时 UINavigationController 内存不会减少
【发布时间】:2011-02-27 16:41:02
【问题描述】:

我有一个基于导航控制器的应用程序,里面有 5 个视图控制器。当我推送视图控制器时,我分配了一些内存,当我返回 popViewController 时,我的 delloc() 方法被正确调用。我确信对于我推送和弹出的每个视图控制器都会以正确的方式调用 dealloc。

尽管如此,当我使用 Instruments 运行应用程序时(从性能工具开始 -> 对象分配,泄漏),对我来说有一个奇怪的行为。 当视图控制器弹出时,内存使用量不会减少,确切地说它不会像预期的那样减少: 当我启动应用程序时,它使用 950 KB,然后我推送第一个视图控制器,内存使用量增加到 1.56MB,最后我弹出视图控制器,内存使用量现在是 1.55MB。

这种行为对吗?我确信每当我弹出一个视图并且 Leaks 工具没有显示任何内存泄漏时,每个 dealloc 方法都会被正确调用。 我猜操作系统以某种方式“保留”了视图,所以到第二次我推送同一个视图控制器时,加载过程要快得多......

有人可以确认这种行为是正确的吗? 谢谢

See this Screenshot from Instruments

【问题讨论】:

  • 附言。 Instruments 是设置为每 X 秒检查一次泄漏还是手动检查一次?
  • 设置为每10秒自动检查一次。有什么改变吗?

标签: iphone memory-leaks uinavigationcontroller instruments


【解决方案1】:

这符合预期。 “你只对你分配、复制等对象负责”的内存处理规则在这里也适用。

当您将内容推送到 navigationController 时,我假设您会这样做:

MyController *myCon = [[MyController alloc] init];
[self.navigationController pushViewController:myCon animated:YES];
[myCon release]; //You have alloc and release.

navigationController 通常处理用户向下钻取数据集并再次向上钻取的层次结构。通过在内存充足时保持控制器是 navigationControllers 节省必须再次实例化控制器 5 秒的方法。稍后当用户点击“返回”时。您可以看到这一点,因为 dealloc 永远不会被调用,但是 viewWillAppear 和 viewDidAppear 在您备份时会被调用。 如果内存不足,navigationController 将开始释放其堆栈上的控制器。

但是!确保前后移动不会导致 viewController 被一次又一次地实例化,这将导致内存占用增加并出现泄漏。 navigationController 应该注意到它的堆栈中已经有 viewController 并简单地显示它。

您应该能够在所有视图中移动,如果它们“适合”内存,那么应用程序从现在开始就永远不会增加其内存占用量。

【讨论】:

  • 感谢您的回复。我按照您的描述实例化了视图控制器。如果我理解得很好,那么我可以假设当点击后退按钮时,即使调用了 dealloc 方法,导航控制器也会“保留”我的控制器?是对的?因为我的 dealloc 总是被调用(我使用 nslog)。我不太明白的一点是,如果已经解除分配,它如何保留我的控制器?还是保留了控制器内部的视图?
  • 如何确保前后移动不会导致视图控制器被一次又一次地实例化?当我单击我的一个视图时,它会更改导航栏,但不会更改视图。为什么?
  • 有道理@RickiG。您是通过观察还是从文档中了解到这种行为的?
  • 只需重新阅读我的答案,我所说的并不清楚的是没有保证!如果 iOS 需要内存,它将释放您的控制器,因此如果控制器被拆除,您需要能够重建控制器。
猜你喜欢
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 2018-05-03
  • 1970-01-01
相关资源
最近更新 更多