gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:11:03 26 4
gpt4 key购买 nike

我有一个基于导航 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com