3

我已经看到了很多网站,在使用时,ARC你仍然需要废止阵列和一些东西,但我认为它是自动的......所以我有几个问题:如何用ARC管理内存?

  • 我什么时候不得不关心记忆,我该怎么办?例如,当我有一个2窗口的应用程序(主窗口+第二窗口),我打电话给第二个窗口并填充数组时,当它关闭返回到主窗口时,我必须把数组= = ?或者在窗户关闭时自动完成ARC?

在此先感谢

+0

我相信ARC会自动完成它。如果没有,那么我有一些工作要做。 – Josiah

+0

我以为是一样的,现在我有一些随机strdup内存泄漏.. :( –

+0

你不必在你的'dealloc'中设置实例变量为零.. ARC将'dealloc'上自动释放这些ivars – s1m0n

回答

1

ARC在Objective-c开发中有很大进步,但即使在使用ARC时,您也必须非常小心内存管理。

我建议你看WWDC 2011 video about ARC做一个很好的使用这个功能,因为你需要看一些细节,真正不浪费设备的内存。

最重要的一点是,你可以得到最好的ARC,确保你没有循环引用,比如一个控制器引用另一个控制器,并且都有强引用,当你认为你销毁了一个控制器时,其他人会保留它,然后你将没有任何记忆。

另一个重要的一点是,您需要确保您告诉编译器您不需要更多的对象,这就是为什么您需要将该数组设置为零,因此编译器只会添加命令来释放数组,因为ARC只是自动引用计数,并且由编译器完成,而不是在运行时完成。现在您的编译器会将发布调用添加到您。

所以回答你两点:

1 - 你总是需要关心的内存,因为圆弧有一定的规则,必须服从,就像设置为nil您不再使用的对象。

2 - 在您的示例中,您需要注意一些问题,首先您需要确保您没有对第二个窗口的引用,并且还需要设置为零,因为Objective-c没有垃圾回收器,所以引用计数不再是显式的。

2

通过抵消你告诉ARC,你不再需要一个阵列,它是安全的iOS把它清理干净的数组。这也是一个很好的做法,因为检查nil对于许多形式的iOS编程非常重要。

是的,您可以允许ARC处理所有事情,但您也可以让iOS在完成后立即清理内存。我还要补充一点,适当的零设置语句可以是一种很好的自我文档形式。

+0

因此,尽管控制器即将关闭并重定向到另一个窗口,如果我手动取消数组,对吗? –

+1

这取决于声明数组的位置。如果它是第二个控制器的ivar,它将在控制器被释放时自动释放。如果它是全局变量或存储在第一个控制器中,则需要手动使其无效。 – MrMage