【问题标题】:Does iOS retrieve leak memory?iOS 是否检索泄漏内存?
【发布时间】:2013-05-22 03:16:21
【问题描述】:

假设我的应用程序在每个 ViewDidLoad 分配内存而不是释放。而且我的应用做了一些导致内存碎片化的工作。

iOS 是否会检索该泄漏内存,或者该泄漏内存在下次重新启动之前不会被触及?

iOS 是否修复了碎片化的内存,或者内存碎片化直到下次重新启动?

我想知道的是iOS是否可以处理泄漏和碎片内存,以便其他应用程序可以流畅运行?

其他移动操作系统(Android、Windows Phone、黑莓)是否也会出现这种情况?

从我读到的Finding and fixing memory leak

All memory you allocate during execution of your app is freed by the system when your app shuts down. This includes any leaks you introduce

这似乎是真的。但是由于很多人说反了,这让我很困惑

【问题讨论】:

    标签: ios memory memory-leaks reboot


    【解决方案1】:

    在 iOS 和 Android(不了解 Windows Phone)中,您的应用可以使用为设备上运行的每个应用分配的有限内存。

    在 iOS 上,如果一个应用程序尝试使用比操作系统分配更多的内存,它会收到一个 memoryWarning 这个 memoryWarnings 有,我认为是 3 个级别,以便应用程序可以在不强制关闭的情况下释放内存。如果前两个级别的内存没有被释放,在下一个 memoryWarning 应用程序将被强制关闭并释放内存。操作系统也会尝试从那些低优先级的应用程序(后台应用程序)中释放内存。

    所以在 iOS 中,如果您不释放应用程序使用的内存,操作系统会以强制关闭

    的价格为您释放它

    在 Andorid 上,情况有点不同,我不同意 borrrden,Android 使用垃圾收集但内存泄漏仍然存在,不像 iOS 上那样令人讨厌,但出现并且更难找到并修复。

    所以在Android上每个应用都分配了一个初始大小的堆,该大小可以增加到一定的大小,如果堆尝试将堆增加到堆的系统限制之上,应用将收到著名的OutOfMemoryError没有任何先前的警告,应用程序将被强制关闭并释放内存。

    在 Andorid 上还有一个令人讨厌的事情是,几乎每个版本的 Android 都有不同的最大堆大小。因此,在某些设备上,该应用程序可能会因 OOM 而崩溃,而在其他设备上使用不同的 Android 版本可能会正常运行。 Android上最后一个讨厌的事情,只有在最新版本的Android上,释放内存时堆大小会减小,这可能会导致OOM,因为系统会在堆完全使用之前增加堆大小(讽刺的是防止OOM),并且由于堆大小不断减小,它将超过最大堆大小。

    Android 还有一个方法onLowMemory,当整个系统没有足够的内存时会调用它,但是这个方法很少被调用。

    总之,Andorid 和 iOS 都会释放内存以防操作系统需要它,但这可以force close您的应用程序。您应该考虑内存使用最佳实践,不要让操作系统自己释放内存,只需创建您的应用程序,以便它使用尽可能少的资源,并且应用程序应该释放所有未使用的内存。

    【讨论】:

    • 您能否提供一个 Android 上的内存泄漏的具体示例(除了使用 NDK)? iOS 中的三级内存警告系统也从 iOS 6 中删除。这很混乱,现在你只收到一个内存警告。如果您在此之后没有足够快地释放内存,那么您的应用程序将被终止。
    • android pre 3.0 上最常见的“泄漏”是在从屏幕上删除位图时出现的,它们使用的内存没有被系统正确释放,因此需要一个“清除”调用每个位图。无论如何,当应用程序上下文作为参数传递给其他类的其他实例并分配给类成员时,任何android版本上最常见的内存泄漏都会出现,应用程序上下文不会从内存中删除,直到应用程序关闭,所以基本上是类已收到应用上下文将永远不会被释放(除非该成员是空的。
    【解决方案2】:

    当进程终止时,进程中的所有内存都将返回给操作系统。我不确定你所说的内存碎片是什么意思,但是所有这些内存都将被返回,操作系统将继续将其分发给其他进程。内存的状态无关紧要(如果需要,程序员有责任将其分配正确归零)。

    Windows Phone 和 Android 是垃圾收集器,因此内存泄漏在很大程度上是无关紧要的。我不知道黑莓。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2020-07-22
      • 2010-10-13
      • 2019-01-28
      • 2015-02-07
      相关资源
      最近更新 更多