2013-05-22 66 views
0

假设我的应用程序为每个ViewDidLoad分配内存,而不是释放。我的应用程序做了一些导致内存碎片化的工作。iOS是否检索泄漏内存?

iOS是否检索到泄漏内存,或者直到下次重新启动之前泄漏内存才被触发?

iOS是否修复了碎片内存,或者内存在下次重新启动之前是否碎片化?

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

对于其他移动操作系统(Android,Windows Phone,BlackBerry),这种行为是否发生?

从我读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 

这似乎是正确的。但是由于很多人说的相反,这让我感到困惑

回答

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

+0

您能否提供一个Android上的内存泄漏的具体例子(除了使用NDK)?此外iOS中的三级存储器警告系统在iOS 6中已被删除。令人困惑的是,现在只有一个存储器警告。如果您在此之后没有足够快地释放内存,那么您的应用程序将被终止。 – borrrden

+0

android pre 3.0中最常见的“漏洞”在位图从屏幕上移除时显示出来,它们使用的内存未被系统正确释放,因此每个位图都需要“清除”调用。无论如何,当应用程序上下文作为参数传递给其他类的其他实例并分配给类成员时,任何Android版本上最常见的内存泄漏都会出现,直到应用程序关闭为止,应用程序上下文才从内存中删除,所以基本上类已经收到应用上下文将永远不会被释放(除非该成员是空的。 – danypata

1

当进程终止时,进程中的所有内存都会返回到操作系统。我不确定你的意思是分割内存,但是所有的内存都会被返回,操作系统将继续把它分配给其他进程。内存的状态是不相关的(如果需要,程序员有责任正确地分配它们的分配)。

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