0

Supposed my app alloc memory every ViewDidLoad and not release. And my app does some work that cause memory fragmented.

Does iOS retrieve that leak memory, or that leak memory is untouched until next reboot?

Does iOS fix that fragmented memory, or memory is fragmented until next reboot?

What I want to know is whether iOS can handle leak and fragmented memory, so that other apps can run smoothly ?

Does this behavior happen the same for other mobile OS (Android, Windows Phone, BlackBerry) ?

From what I read 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

This seems true. But since many people say the opposite, which makes me confused

4

2 回答 2

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您的应用程序。您应该考虑内存使用最佳实践,不要让操作系统自己释放内存,只需创建您的应用程序,以便它使用尽可能少的资源,并且应用程序应该释放所有未使用的内存。

于 2013-05-22T08:38:23.423 回答
1

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

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

于 2013-05-22T03:26:39.783 回答