繁体   English   中英

我应该在ARC中使用nil吗?

[英]Should i use nil in ARC

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

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

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

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

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

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

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

只需检查谁解雇控制器后对谁生活的对象。

该控制器必须对所有将要释放它的对象进行所有引用,并且只有这个控制器,不能再使用它。

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

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

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并不意味着从那个时刻开始就可以获得内存。 如果在那里停留相当长的时间,如果操作系统无法找到足够的内存比这些release -d内存中采取的OS。

解雇控制器是否解除分配所有子对象?

不是本质上,不是。 这取决于。 在应用程序中没有对它的强引用之后,将释放一个对象。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM