iOS内存管理,(泄漏,保留周期)

时间:2015-09-12 01:42:49

标签: ios objective-c memory memory-leaks retain-cycle

我对应用内存会发生什么有一些一般性的问题。

  1. 当应用进入后台或暂停时,内存会发生什么变化。我问这个是因为我的应用程序有一些内存泄漏,根据我的研究,在Apple的框架中存在漏洞而不是由于我的编码。泄漏相当小(约100字节),因此它们不应该破坏性能。但是,我想知道当用户停止使用应用程序时这些泄漏会发生什么?他们会离开还是永远留在手机的记忆中?

  2. 另外,另一个非常相似的问题,除了保留周期。当用户退出应用程序时,保留周期是否得到解决,假设在使用时崩溃应用程序不是一个大问题?

  3. 因此,简而言之,当用户退出应用程序时,分配和内存重置为0,这是我想要的。

    感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

答案很复杂。

应用可以处于各种状态:

Active
Inactive
Running in the background

Suspended 

Not running

除了“未运行”状态以外,应用程序都在内存中,并且内存泄漏会继续累积。

通常,当您的用户按下主页按钮时,应用程序会快速转换为非活动状态(仍然在前台运行但没有用户交互)到后台(仍在运行,但另一个应用程序具有焦点)并暂停(在内存中,但不是获取任何处理器时间。在此状态下,您的代码根本没有被调用。)当应用程序进入暂停状态之前,您会收到通知,因为应用程序将变为非活动状态和后台状态。

为了响应applicationDidEnterBackground消息,您需要保存需要保存的任何信息。

一旦应用程序处于暂停状态,它可以在没有任何进一步警告的情况下终止。如果您此时尚未将信息保存到文件中,则会丢失。

如果应用程序处于挂起状态,然后被唤醒到其中一个运行状态,则所有内存中的对象仍然存在,并且内存泄漏仍在累积。

正如@blobbfuesch所说,内存泄漏会导致您的应用程序耗尽越来越多的设备内存。如果您的内存使用量太大,系统会向您发出一个或多个内存警告,如果您没有释放足够的内存,它将终止您。

由于泄露的内存丢失,您无法将其释放。即使很小的泄漏也会增加。如果用户保持活动时间足够长,则会累积并导致应用程序终止,这对用户来说就像是崩溃。

如果应用程序在处于挂起状态时终止,它将从内存中卸载,并且必须在下次运行时重新启动。在这种情况下,先前泄露的内存会被恢复,但之后会再次泄漏。

答案 1 :(得分:2)

  1. 如果您的应用程序进入后台,iOS将不会更改您的应用程序内存,但会通过发送内存警告告诉您的应用程序释放内存,因为需要新内存。您在应用程序中使用的大多数Apples框架(如UIKit和MapKit)在这种情况下也会释放内存。

    当应用程序终止时,应用程序分配的所有内存都将被释放。这包括保留周期和内存泄漏。保留周期很糟糕,因为它们会导致应用程序的内存消耗量增加。在后台运行的应用程序如果使用更多内存则会提前终止。如果某个应用在前台使用了太多内存,iOS也会终止您的应用,因此您应该始终通过使用弱引用来阻止iOS中的保留周期,以防止iOS过早终止您的应用。

  2. 当应用程序终止时,所有内存都被释放,当应用程序退出时,保留周期将被解析。但是,如果再次启动它并执行相同的代码,您的应用程序将再次创建相同的保留周期。