何时调用dealloc
方法?我发现(在很多例子中)很多NS变量都是在它实例化的方法中发布的,但是在合成一个组件时,他们将这个版本放在dealloc方法中。
答案 0 :(得分:10)
Apple reference文件明确指出 到接收方的后续消息可能会生成错误,指示已将消息发送到解除分配的对象(前提是尚未重新分配已释放的内存)。
您永远不会直接发送dealloc消息。相反,通过释放NSObject协议方法间接调用对象的dealloc方法(如果释放消息导致接收者的保留计数变为0)。有关使用这些方法的详细信息,请参阅“内存管理编程指南”。
子类必须实现自己的dealloc版本,以允许释放对象消耗的任何额外内存 - 例如动态分配的存储空间,用于释放对象所拥有的数据或对象实例变量。在执行特定于类的释放后,子类方法应该通过消息将dealloc的超类版本合并到super:
重要说明:请注意,当应用程序终止时,可能无法向对象发送dealloc 消息,因为进程的内存在退出时自动清除 - 它更有效 只是允许操作系统清理资源而不是调用所有内存 管理方法。由于这个原因和其他原因,你不应该管理稀缺的资源 的dealloc
答案 1 :(得分:0)
当你加载nib文件时,必须是一个拥有者 应用程序中存在的对象。如果你打开了nib文件 界面构建器您将看到代表所有者的代理图标 的nib文件。您可以连接它,但连接 未建立UNTIL nib文件已加载,您指定谁 真的很棒。
无论如何,你可以在顶部连接一个插座(例如i-var) nib文件中的级别UI对象,通常是窗口。当你加载 nib文件并指定i-var现在将指向的所有者 UI对象。让我们说这是一个窗口。最终当你决定 摆脱你只是释放所有者的UI对象,如果它 达到保留计数为零,dealloc方法将被调用。 然后所有者的dealloc方法应该释放它的i-vars (实例变量)。那么让我们说你连接的i-var 窗口叫做窗口。那你应该有类似的东西 这样:
- (void)dealloc { [窗口发布]; [super dealloc]; }
然后应该使窗口达到零计数。然后 应该调用窗口的dealloc,然后调用它 释放子视图上的所有保留,子视图将到达 保留计数为零,他们随后将释放所有 保留他们的子视图,依此类推,直到所有内容都被解除分配。
我做了AppKit(可可)编程已经有一段时间了,但我想 这仍然是真的。
有一个名为OmniObjectAlloc的Omni应用程序 就像在查看你的应用程序时应该非常有用的那样 搞清楚是否所有东西都被取消了。我用过ObjectAlloc 来自NeXT / Apple,但我不知道他们是否仍然提供它。寻找 它,我想它仍然存在。
答案 2 :(得分:-1)
它基于您实际创建或保留的对象的范围。 每当将retaountount恢复为1时,dealloc方法将由其自己调用。 这仅适用于MRC,不适用于ARC。
一个好的注意事项是跟踪您创建的对象,让它在您的实现中不泄漏。