iphone - 弹出 Controller 时 UINavigationController 内存不会减少

标签 iphone memory-leaks uinavigationcontroller instruments

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

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

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

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

See this Screenshot from Instruments

最佳答案

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

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

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

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

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

您应该能够浏览所有 View ,如果它们“适合”内存,则应用程序从现在开始不应增加其内存占用量。

关于iphone - 弹出 Controller 时 UINavigationController 内存不会减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2972638/

相关文章:

r - 意外的 R 内存管理行为

ios - 如何从 iOS 中的 NSObject 类导航到 ViewController?

Swift Combine - CFString(存储)内存泄漏

java - Android:绝对清除 Activity

swift - 将 NavigationBarController 设置为 rootViewController

ios - popToRootViewController 然后 pushViewController

iphone - iPhone 上的音频合成从哪里开始

iphone - 从UIButton获取位置坐标

iphone - 如何在 iOS(iPhone 和 iPad)上播放带有 HTML5 视频标签的 mp4 视频文件?

iphone - 将合成(保留)属性设置为 nil 时的 EXC_BAD_ACCESS