iOS 内存管理,(泄漏,保留周期)
iOS Memory management, (leaks, retain cycles)
我有一些关于应用程序内存会发生什么的一般性问题。
当应用程序进入后台或挂起时,内存会发生什么变化。我问这个是因为我的应用程序有一些内存泄漏,根据我的研究,这是 Apple 框架中的错误,而不是由于我的编码。泄漏相当小,(约 100 字节),因此它们不应影响性能。但是,我想知道当用户停止使用该应用程序时,这些泄漏会发生什么情况?他们会消失还是永远留在 phone 的记忆中?
此外,另一个非常相似的问题,除了保留循环。当用户退出应用程序时,是否会解决保留周期问题,假设在使用过程中导致应用程序崩溃不是什么大问题?
所以,简而言之,当用户退出应用程序时,分配和内存是否会重置为 0,这就是我想问的问题。
感谢您的帮助!
- 如果您的应用程序进入后台,iOS 不会更改您的应用程序内存,但会通过发送内存警告告诉您的应用程序释放内存,因为需要新内存。在这种情况下,您在应用程序中使用的大多数 Apple 框架(如 UIKit 和 MapKit)也会释放内存。
当应用程序终止时,应用程序分配的所有内存都会被释放。这包括保留周期和内存泄漏。保留循环是不好的,因为它们会导致您的应用程序消耗更大的内存。如果后台应用程序 运行 使用更多内存,它们会提前终止。如果应用程序在前台使用过多内存,iOS 也会终止您的应用程序,因此您应该始终使用弱引用来打破应用程序中的保留周期,以防止 iOS 过早终止您的应用程序。 - 由于在应用程序终止时会释放所有内存,因此在应用程序退出时会解决保留周期问题。但是,如果您再次启动它并执行相同的代码,您的应用将再次创建相同的保留周期。
答案很复杂。
一个应用程序可以处于多种状态:
Active
Inactive
Running in the background
Suspended
Not running
在除 "not running" 状态之外的所有状态下,应用程序都在内存中,您的内存泄漏会继续累积。
通常,当您的用户按下主页按钮时,该应用会快速从非活动状态(仍然 运行ning 在前台但没有用户交互)过渡到后台(仍然 运行ning 但另一个应用有焦点)和挂起(在内存中,但没有获得任何处理器时间。在此状态下根本没有调用您的代码。)当应用程序进入非活动状态并进入后台状态时,您会收到通知,然后再进入到暂停状态。
您需要保存响应 applicationDidEnterBackground 消息所需的任何信息。
一旦应用程序处于挂起状态,它就可以在没有任何进一步警告的情况下终止。如果此时您还没有将信息保存到文件中,那么它就会丢失。
如果应用程序保持挂起状态,然后被唤醒到 运行ning 状态之一,您所有的内存中对象仍然存在,并且您的内存泄漏仍在累积。
正如@blobbfuesch 所说,内存泄漏会导致您的应用占用越来越多的设备内存。如果你的内存使用过多,系统会给你一个或多个内存警告,如果你没有释放足够的内存,它会终止你。
因为泄露的内存已经丢失,您不能释放它。即使是小的泄漏也会累积起来。如果用户保持您的活跃时间足够长,它们就会累积并可能导致您的应用程序终止,这对用户来说就像是崩溃。
如果应用程序在挂起状态时终止,它将从内存中卸载,并且必须在下次 运行 时重新启动。在这种情况下,先前泄漏的内存得到恢复,但随后又开始泄漏。