我应该在ARC中使用nil吗?

时间:2012-12-24 19:43:36

标签: iphone ios ios5 automatic-ref-counting

我读了很多文章但是当我做的时候我觉得我错过了一些东西。

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

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

我的应用程序仍在运行,这些对象将来会被解除分配(它们不会泄漏,因为它们没有被仪器泄漏显示并且没有保留周期)或者我必须通过将它们设置为nil而显式强制,因为我不这样做他们需要他们浪费记忆力。

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

对象列表中的工具显示的更多对象具有由我的代码方法分配的名称<x06...>malloc。我是否应该担心这些对象分配?

3 个答案:

答案 0 :(得分:2)

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

在检查控制器之后,只需检查谁对ref居住的对象进行检查。

该控制器必须对所有将要释放它的对象进行所有引用,并且只对该控制器进行解除分配。

关于在ARC中设置为nil。是的,这是一个很好的做法。 例如,所有出口自动(当您从IB拖动到带有右键的代码时)被创建为(非原子,弱)。 - 表示在取消分配对象时,它将设置为 nil

此外,关于ARC,nils和其他人:http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

答案 1 :(得分:1)

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

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

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

并且release - 并不意味着那个记忆将从那个时刻开始提供。如果在那里停留相当长的时间,并且操作系统找不到足够的内存而不是这些release - 操作系统会占用内存。

答案 2 :(得分:0)

  

解雇控制器是否释放所有子对象?

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

因此,例如,如果您有一个强大的实例变量引用您的控制器,则解除它不会导致重新分配,因为您仍然有一个强引用它。但是,如果之后将其设置为nil,并且没有对该对象的其他强引用,则然后将取消分配。

另一方面,如果你的代码中没有对它的强引用,那么对它的唯一强引用是来自呈现视图控制器,所以当它解散它时,将没有强引用它在你的申请中,它将在被解雇后解除分配。

  

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

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