我应该在 ARC 中使用 nil

Posted

技术标签:

【中文标题】我应该在 ARC 中使用 nil【英文标题】:Should i use nil in ARC 【发布时间】:2012-12-24 19:43:35 【问题描述】:

我已经阅读了很多文章,但是当我实际阅读时,我觉得我错过了一些东西。

我有一个应用程序,其中我正在为模块设置一个单例对象,该模块呈现在其他视图控制器之上。这个单例对象实例化其他子对象。完成任务后,我 关闭控制器并设置 nil到单例对象。但在仪器中,它显示我的这个模块创建的许多对象仍然活着

我的第一个问题是- 是否解除控制器释放其所有子对象?或者我必须明确地将其设置为 nil。

我的应用程序仍在运行,当这些对象将来被释放时(它们不是泄漏,因为仪器泄漏没有显示它们并且没有保留周期)或者我必须通过将它们设置为 nil 来明确强制,因为我没有需要它们,它们是在浪费内存。

为什么当我释放了它的超级父对象(即单例对象)时,这些强大的属性和两个或三个实例变量仍然存在。

在对象列表中,仪器显示的还有一些对象名称为<x06...>malloc,它们是由我的代码方法分配的。我应该担心这些对象分配吗?

【问题讨论】:

你应该澄清你是在谈论属性还是实例变量。 @直到它们是属性并且两个或三个是实例变量 【参考方案1】:

第一个问题: 不,它只是调用释放:引用计数减 1,但是当引用计数等于 0 时释放。

只需检查谁在解除控制器后对活着的对象进行引用。

这个控制器必须获取所有将被释放的对象的所有引用,只有这个控制器,没有更多的。

关于在 ARC 中设置为零。是的,这是一个很好的做法。 例如,所有 outlets 自动(当您将其从 IB 拖动到具有右键的代码时)都被创建为(非原子,弱)。 Weak - 表示当对象被释放时它会被设置为 nil

另外,关于 ARC、nils 等:http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

【讨论】:

【参考方案2】:

is dismissing a controller deallocate all its child object or not? or i have to explicitly set it to nil.

是的,它调用释放。之后将nil 分配给他们只是一件事。

nil 确保在释放旧对象后不再指向任何垃圾。将 nil 分配给对象或将 NULL 分配给内存指针是类似的。

release-ing 并不意味着该内存将从那一刻开始可用。如果在那里停留了很长时间,并且如果操作系统无法找到足够的内存,那么这些release-d 内存就会被操作系统占用。

【讨论】:

【参考方案3】:

关闭控制器是否释放其所有子对象?

本质上不是,不。这取决于。在您的应用程序中不再有对它的强引用后,该对象将被释放。

因此,例如,如果您有一个强大的实例变量引用您的控制器,将其关闭不会导致释放,因为您仍然对它有一个强引用。但是,如果您之后将其设置为nil,并且没有其他对该对象的强引用,那么它将被释放。

另一方面,如果您的代码中没有对它的强引用,则对它的唯一强引用来自呈现视图控制器,因此当它关闭它时,将不会有对它的强引用在你的应用程序中,所以它会在它被解雇后被释放。

为什么当我释放了它的超级父对象(即单例对象)时,这些强大的属性和两个或三个实例变量仍然存在。

您在这里混淆了您的术语。没有“超级父母”这样的东西。有超类和超视图,但不清楚你是否指的是它们中的任何一个。如果您有无法摆脱的持久对象,请发布您正在使用的代码。

【讨论】:

感谢您的回复,“超级父”是指它们定义的属性和实例变量的包含关系。实际上我在这个模块中的所有对象都来自单例对象,它们没有任何关系在我的应用程序中使用对象,但问题是当我将此 singelton 对象设置为 nil 时它们没有被释放。你知道为什么它们没有释放吗?

以上是关于我应该在 ARC 中使用 nil的主要内容,如果未能解决你的问题,请参考以下文章

我需要在 ARC 中使用 dealloc 方法吗?

Objective-C在ARC下,把strong指针设置为nil,请问这样不会不释放指针的内存空间?

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

核心数据属性更改为 nil(与 ARC 相关?)

Iphone 开发 - ViewDidUnload

我应该在接口中声明变量还是在objective-c arc中使用属性?