4

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

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

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

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

请参阅 Instruments 的此屏幕截图

4

1 回答 1

6

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

当您将内容推送到导航控制器时,我假设您这样做:

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 将开始释放其堆栈上的控制器。

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

You should be able to move through all the views and if they "fit" in memory, the app should never increase its memory footprint from here on out.

于 2010-06-04T10:22:53.847 回答