2011-04-12 38 views
5

何时调用dealloc方法?我发现(在很多例子中),很多NS变量都是在实例化的方法中发布的,但是当合成一个组件时,他们会将发布放在dealloc方法中。何时调用dealloc方法?

回答

10

Apple reference文档清楚地指出 对接收者的后续消息可能会生成一个错误,指示消息已发送到解除分配的对象(假设解除分配的内存尚未被重新使用)。

你从来没有直接发送dealloc的消息。取而代之的是,对象的dealloc方法是通过释放NSObject的协议方法调用间接(如果该释放消息中接收器的保留计数成为0的结果)。见内存管理编程指南在使用这些方法的详细信息。

子类必须实现自己的dealloc的版本允许通过重新分配的对象所拥有的用于数据动态分配存储或对象,例如对象的实例变量消耗任何额外的内存释放。执行类特定的解除分配之后,子类方法应该通过消息合并的dealloc的超类版本超级:

重要:注意的是,当应用程序终止,对象可能无法发送自一个的dealloc 消息该进程的内存在退出时自动清除 - 它更有效率,因为它只是允许操作系统清理资源,而不是调用所有内存管理方法。对于这样那样的原因,你不应该在 的dealloc

管理稀缺资源的基础上,你实际上创造或保留的对象的范围另一个SO问题iPhone - when is dealloc for a viewcontroller called?

0

当您加载nib文件时,必须有一个所有者,它是存在于应用程序中的一个 对象。如果在 界面构建器中打开nib文件,则会看到一个代理图标,代表nib文件的所有者 。您可以建立连接,但连接 尚未建立,直到加载了nib文件并指定了onwer的真实身份。

无论如何,你可以有一个插座(例如i-var)连接到nib文件中顶层 级别的UI对象,通常是窗口。当您加载 nib文件并指定i-var现在将指向 UI对象的所有者时。假设这是一个窗口。最终,当您决定去掉UI对象时,您只需释放所有者,并且如果 的保留计数为零,则会调用dealloc方法。 然后,所有者的dealloc方法应释放它的i-vars (实例变量)。我们假设你连接到 的i-var窗口被称为window。那么你应该有这样的东西:这个:

- (void)dealloc {window release]; [super dealloc]; }

这应该会导致窗口达到零计数。然后 该窗口的dealloc应该被调用,并且随后 将发布子视图上的所有保留,并且子视图将达到 保留计数为零,并且随后将在其子视图上释放所有 保留,等等,直到所有是交易。

自从我做了AppKit(Cocoa)编程以来,这已经有一段时间了,但我认为 这仍然是正确的。

Omni有一个叫做OmniObjectAlloc的应用程序,或者类似于 的应用程序,它应该在查看你的应用程序时非常有帮助,并且确定是否所有事情都得到处理。我使用NeXT/Apple的ObjectAlloc ,但我不知道他们是否仍提供它。寻找 它,我会想象它仍然存在。

-1

它。 每当retaincount回到1时,dealloc方法将被自己调用。 这只适用于MRC,不适用于ARC。

一个很好的注意事项是跟踪您创建的对象,让它在您的实现中不泄漏。

+0

当保留计数减少到0时,会调用'dealloc'。因为将RC递减到0将毫无意义,这是没有做到的。但是当“剩余量回到1”时,这个对象仍然非常活跃。 – bbum 2016-09-03 15:30:01

相关问题