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

iOS内存管理(泄漏、保留周期),ios,objective-c,memory,memory-leaks,retain-cycle,Ios,Objective C,Memory,Memory Leaks,Retain Cycle,我有一些关于应用程序内存的一般性问题 当应用程序进入后台或挂起时,内存会发生什么变化。我问这个问题是因为我的应用程序有一些内存泄漏,根据我的研究,这些泄漏是苹果框架中的错误,而不是由于我的编码。泄漏相当小(约100字节),因此它们不应破坏性能。然而,我想知道当用户停止使用应用程序时,这些泄漏会发生什么?它们会消失还是永远留在手机的记忆中 另外,还有一个非常类似的问题,除了保留周期。当用户退出应用程序时,是否可以解决保留周期问题,前提是在使用过程中不会造成应用程序崩溃 所以,简而言之,当用户退出应

我有一些关于应用程序内存的一般性问题

  • 当应用程序进入后台或挂起时,内存会发生什么变化。我问这个问题是因为我的应用程序有一些内存泄漏,根据我的研究,这些泄漏是苹果框架中的错误,而不是由于我的编码。泄漏相当小(约100字节),因此它们不应破坏性能。然而,我想知道当用户停止使用应用程序时,这些泄漏会发生什么?它们会消失还是永远留在手机的记忆中

  • 另外,还有一个非常类似的问题,除了保留周期。当用户退出应用程序时,是否可以解决保留周期问题,前提是在使用过程中不会造成应用程序崩溃

  • 所以,简而言之,当用户退出应用程序时,分配和内存是否重置为0,这就是我试图问的问题

    谢谢你的帮助

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

    应用程序终止时,会释放应用程序分配的所有内存。这包括保留周期和内存泄漏。保留周期是不好的,因为它们会导致应用程序的内存消耗增加。如果在后台运行的应用程序占用更多内存,则会提前终止。如果应用程序在前台使用过多内存,iOS也会终止你的应用程序,因此你应该始终使用弱引用来打破应用程序中的保留周期,以防止iOS过早终止你的应用程序

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

  • 答案很复杂

    应用程序可以处于多种状态:

    Active
    Inactive
    Running in the background
    
    Suspended 
    
    Not running
    
    在除“未运行”状态外的所有状态下,应用程序都在内存中,内存泄漏会继续累积

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

    您需要保存任何需要保存的信息以响应ApplicationIdentinterBackground消息

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

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

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

    由于泄漏的内存丢失,您无法释放它。即使是小的泄漏也会累积起来。如果用户让你的活动时间足够长,它们就会累积,并可能导致你的应用程序终止,这对用户来说就像是一场崩溃


    如果应用程序在挂起状态下终止,它将从内存中卸载,并在下次运行时重新启动。在这种情况下,以前泄漏的内存将被恢复,但随后又开始泄漏。

    谢谢您的回答。您建议如何查找保留周期?我相信它们没有显示在泄漏仪器中。1。第一句话不是真的。后台或挂起的应用程序没有释放任何内存。只有当应用程序进程完全终止时才会发生这种情况。@rmaddy我观察到,我制作的一个应用程序在后台释放了越来越多的资源,但没有终止。这个过程不会立即发生,但会发生,因为前台应用程序需要更多内存。在这种情况下,可能是某些代码响应内存警告。除非应用程序的某些部分是专门编写的,否则不会释放内存。@BWu。泄漏仪器应找到保留周期。此外,您还可以使用分配工具检查泄漏和保留周期,重复操作,并在每次重复后使用“标记生成”工具。如果您的应用程序在多代中分配但不释放内存,您可能会在应用程序中发现保留周期或内存泄漏。您可以通过查看每一代人的分配情况来确定它。谢谢您的回答。据我所知,我所指的小内存泄漏并不经常发生,我对此无能为力,因为它们是Apple(WKWebview和UIAlertView)的bug。我的重点是在这一点上寻找保留周期。你对寻找保留周期有什么建议吗?我不认为它们显示在泄漏仪器中,我很确定泄漏仪器确实标记保留周期。您是否在模拟器或设备上发现了您正在谈论的其他泄漏?这些年来,我在系统框架中看到了几个只在模拟器中出现的内存泄漏案例。(可能是由于系统框架模拟实现中的错误造成的。)我在一台设备上发现了其他漏洞。当我尝试在模拟器上使用仪器时,它会使我的Mac mini冻结/滞后很多(我不知道为什么),但它并没有使我的设备滞后那么严重