在 iOS 应用程序的生命周期中何时触发 ARC? [复制]

Posted

技术标签:

【中文标题】在 iOS 应用程序的生命周期中何时触发 ARC? [复制]【英文标题】:When ARC is triggered in the lifecycle of an iOS app? [duplicate] 【发布时间】:2015-07-23 15:41:08 【问题描述】:

ios中使用ARC,当引用计数为0时,对象会被自动释放。在swift book的示例中,代码将一些var设置为nil,以使引用计数为0。在一个真正的 iOS 应用程序,除非对象真的很大,否则我可能不会故意设置为 nil 来释放内存。

我的问题是,ARC 中的解除分配何时会在应用的生命周期中发生?我正在考虑两种情况:

    如果我们从一个视图控制器转移到下一个视图控制器,第一个视图控制器会自动释放吗?假设我们不在下一个视图控制器中保留副本。

    如果 iOS 以某种方式杀死了我们的应用程序,说它需要内存或其他什么,它是否只是清除了我们应用程序使用的所有内存?或者它将设置为 nil 并触发 ARC 完成工作?如果代码中有一些强引用循环,这种情况会不会出现内存泄漏?

【问题讨论】:

感谢您提供资源。但是在阅读完案例 1 或案例 2 后,我无法回答它们……用于内存管理的 ARC 并不新鲜。我只是想知道它是如何在 iOS 应用程序的生命周期中使用的。 如果您想询问特定场景,我建议您只询问单个特定场景。否则,您的问题有点宽泛。 【参考方案1】:
    这里已经回答了,如果第一个视图控制器推送/呈现另一个控制器,它将不会被释放。 如果 iOS 杀死您的应用程序,您的应用程序持有的所有内存都将被释放。所以接下来当你打开你的应用程序时,它将是一个全新的发布。还有一种叫做内存警告的东西,当设备内存不足或您的应用程序消耗大量内存时,操作系统会发出内存警告。实现didReceiveMemoryWarning 方法并释放任何未使用的数据或资源。它可以使您的应用免于被操作系统杀死。

【讨论】:

我明白了。所以基本上ARC是由我们自己在didReceiveMemoryWarning函数中通过将引用设置为nil来触发的,对吧?而且,如果app真的被杀掉了,不管引用周期如何,内存都会被清空,对吧? @AnsonYao ARC 不是由我们自己触发的,操作系统负责那里的内存管理。为了更清楚,让我们假设一个场景,VC A 推送/呈现 VC B,当用户关闭 VC B 时,它将自动释放(控制器及其所有变量),除非存在保留周期【参考方案2】:

据我了解,视图控制器保存在堆栈中,未从堆栈中弹出的控制器保留其对象。

强引用循环可能导致内存泄漏,或者在释放包含该对象的内容后使用比当前所需更多的内存。

【讨论】:

感谢您的回答。对于第一种情况,我同意你的看法。但是第二种情况还不清楚…… 如果你对一个类中的一个变量有一个强引用循环并且这个类被释放了,它可能仍然和变量一起被分配在内存中。我在 Big Nerd Ranch Cocoa 编程书中读到了这一点,尽管那是很久以前的事了。

以上是关于在 iOS 应用程序的生命周期中何时触发 ARC? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序:渲染流程、生命周期和触发顺序

知道 -viewWillAppear 何时触发但 -viewWillDisappear 尚未触发

iOS ViewController 生命周期最佳实践 [关闭]

在 UIView 生命周期中知道何时销毁视图

关于片段生命周期,何时调用片段的 onActivityResult?

Bean对象的生命周期