假设我的应用为每个ViewDidLoad分配内存而不是释放。我的应用程序做了一些导致内存碎片化的工作。
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
这似乎是真的。但由于很多人说相反,这让我感到困惑
答案 0 :(得分:1)
当进程终止时,进程中的所有内存都将返回到操作系统。我不确定你是什么意思,你正在分割内存,但所有内存都将被返回,操作系统将继续将其输出到其他进程。内存的状态是无关紧要的(如果需要,程序员有责任将其分配正确归零)。
Windows Phone和Android是垃圾收集,因此内存泄漏在很大程度上是无关紧要的。我不知道黑莓。
答案 1 :(得分:1)
在iOS和Android(不了解Windows Phone)中,您的应用可以使用为设备上运行的每个应用分配的有限内存。
在iOS上,如果一个应用程序将尝试使用比分配的操作系统更多的内存,它将收到一个内存警告这个内存警告有,我认为3级,这样应用程序可以释放内存而无需强制关闭。如果内存未针对前两个级别取消分配,则在下一个内存警告时,应用程序将强制关闭并释放内存。此外,操作系统将尝试从低优先级的应用程序(后台应用程序)释放内存。
所以在iOS中,如果您没有释放应用程序使用的内存,操作系统将以强制关闭的价格为您释放它
在Andorid上,情况有点不同,我不同意borrrden
,Android使用垃圾收集,但内存泄漏仍然存在,而不是像iOS上那样出现但是出现并且它们更难找到并修复。
所以在Android上,每个应用程序都分配了一个初始大小的堆,可以增加到某一点,如果堆尝试将堆增加到堆的系统限制以上,应用程序将收到着名的{{1没有任何先前的警告,应用程序将被强制关闭并释放内存。
Andorid还有一个令人讨厌的事情,几乎每个版本的Android都有不同的最大堆大小。因此,在某些设备上,应用程序可能会与OOM崩溃,而在其他设备上则可能会运行不同的Android版本。而Android上的最后一件令人讨厌的事情,只是在最新版本的Android上,当内存释放时堆大小会减少,这会导致OOM,因为系统会在堆充分使用之前增加堆大小(具有讽刺意味的是防止OOM)并且由于堆大小减小,它将超过最大堆大小。
Android也有一个方法OutOfMemoryError
,当整个系统没有足够的内存但这个方法很少被称为时,就会调用它。
总之,Andorid和iOS都会释放内存,以防操作系统需要它,但这可以onLowMemory
你的应用程序。您应该考虑内存使用最佳实践,不要让操作系统自行释放内存,只需创建您的应用程序,以便尽可能少地使用资源,应用程序应释放所有未使用的内存。