1

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

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

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

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

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

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

4

3 回答 3

2

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

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

该控制器必须获取对将与其一起释放的所有对象的所有引用,并且只有这个控制器,没有其他人。

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

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

于 2012-12-24T19:59:10.403 回答
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-ing 并不意味着该内存将从那一刻开始可用。如果在那里停留了很长时间,并且如果操作系统无法找到足够的内存,那么这些release-d 内存就会被操作系统占用。

于 2012-12-24T19:51:21.430 回答
0

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

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

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

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

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

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

于 2012-12-25T00:49:16.020 回答