IOS App的内存使用大小

Posted

技术标签:

【中文标题】IOS App的内存使用大小【英文标题】:Size of memory usage of IOS App 【发布时间】:2017-06-14 17:50:47 【问题描述】:

我创建了一个有 12 个视图控制器的应用程序,它有很多图形(图像文件)

当我启动应用程序时,我注意到当我在视图控制器中移动时内存增加了。一旦我通过所有控制器,内存为 530Mb

所以我的问题是:-

a) 需要使用这么多内存吗 b) 我应该担心吗 c)我如何在导航时从内存中删除视图控制器..例如,我有一个用于登机的视图控制器,但是一旦单击跳过或开始,我会转到下一个视图控制器,所以理论上它不会'不需要再加载了..

想法?

我在具有 3Gbm 的 iPhone 7 Plus 上运行,但希望能够在 iPhone SE 以后的其他手机型号上运行该应用程序。但是我注意到内存配置文件大约是 iPhone SE 的 50%,但假设那是因为它没有按照 plus 手机加载 x3 图像

【问题讨论】:

【参考方案1】:

a) 这么多内存要使用吗

lot 是一个相对术语,530Mb 是不是很多,完全取决于应用在做什么以及它是什么类型的应用!如果它是一款具有丰富图形的游戏,我不会太在意,但如果它是一个普通的实用应用程序,我会担心!

b) 我应该担心吗

随着用户加载应用程序的各种屏幕而积累/增加内存是一种非常常见的情况。如果它不断增加并且永远不会下降,您应该感到困扰。每次 VC 加载时,它可能会加载大量图形,或者可能会分配大量变量并消耗大量内存来执行其功能。这是相当公平的。但是,一旦用户从应用程序导航堆栈中弹出 VC,则应返回 VC 分配的所有内存,并且应用程序消耗的总内存应该下降。理想的内存足迹看起来就像一波波,一旦 VC 出现,它就会达到峰值并下降。如果那没有发生,你就有麻烦了:)

c) 我如何在导航时从内存中删除视图控制器

    使用正确的导航技术。除非您确实需要将该 VC 实例保留在内存中,否则不要一直将 VC 推送到导航控制器堆栈。所有推送到导航堆栈的 VC 将继续保留在内存中,直到用户终止应用或 ios 决定在收到内存警告时终止应用。

    在每个 VC 中编写 deinit/dealloc,并确保每次用户弹出 VC 时都会调用它,方法是在按下返回按钮时点击返回按钮,或者在以模态方式显示时关闭 VC。确保调用每个 VC 的 deinit 是确保 VC 不占用任何不必要内存的最佳方法。

    确保您的 VC 中没有一个代码会导致保留周期,并将对象永久保留在内存中。示例:如果您的 VC 声明了一个块并持有对块的强引用,并且如果您通过 self 来阻止您的块,那么 self 将永远不会被释放。保留循环的经典示例。确保您的代码不会产生这样的死锁

    除非必要,否则永远不要使用 strong/retain 来保持任何东西。

    使用仪器查找每个对象的内存泄漏和引用计数,以确保您的应用程序中没有内存泄漏。

【讨论】:

@sandeep-bhandaripp 感谢您提供的信息……还有几个问题……有点新手,但是正确的导航技术是什么意思?我创建了一个单一视图应用程序并在它们之间添加了各种 VC 和序列,这是错的吗?还阅读了有关 ARC 的内容,我认为 VC 会放手,但我使用的是 swift 3,那么你如何取消 VC 的初始化? @user2596590 :如果您使用的是 push/show segue,则视图控制器会被推送到导航堆栈。在用户通过点击后退按钮弹出 ViewController 或终止应用程序之前,推送到导航堆栈的视图控制器不会被释放。因此,如果您确实希望 VC 持续存在并允许用户在点击返回时返回该屏幕,则应该使用 push。如果你推送 loginVC,那么 loginVC 也将被持久化,但登录是一次使用,你不希望用户在这种情况下通过点击返回到该屏幕,使用推送将使 LoginVC 保留在内存中 因此,任何您不希望它持续存在的 VC,您都使用模态 segue 并在使用后将其关闭以摆脱它,这不会使 VC 保留在内存中。同样,每次用户点击推送的 VC 上的后退按钮并从导航堆栈中弹出 VC 时,都会调用 VC 的 deist/dealloc。确保它被调用。如果它没有被调用,那意味着你的 VC 被一些不允许它释放的东西持有。因此内存不会下降。 @sandeep-bhandaripp 非常有用,我正在使用模态序列,但我并不总是想回到 VC。例如 VC A -> VC B -> VC C,所以如果我在 VC B 并使用驳回它会将我带回 VC A,但我想去 VC -C 并驳回 VC-B ?跨度> 在我的一个控制器上,我确实返回到调用 VC 并关闭了...并且我已经放置了 deinit print("deinit called") 并且它确实被调用了,但是内存没有不回去吗?

以上是关于IOS App的内存使用大小的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 Photos.app 时,我的 iOS 应用程序因内存压力而终止

iOS uiimage内存占用大小计算

iOS - 调整图像大小导致内存泄漏

IOS内存管理详解

IOS基础之 内存管理

使用Xcode Instruments Leak解决内存泄漏问题