在 dealloc 中调用 self 的方法

Posted

技术标签:

【中文标题】在 dealloc 中调用 self 的方法【英文标题】:Calling a method on self while in dealloc 【发布时间】:2011-02-23 17:36:11 【问题描述】:

我有一本在发布前需要清理的对象字典。我有一种方法可以对整个字典执行此操作。在我在-dealloc 方法中发布字典之前,我想做同样的事情。但是,我不确定释放期间对象的状态。例如,在 C# 或 Java 中,我永远不会对正在完成的对象调用方法,但我不确定这是否适用于 Objective C 和释放。在释放期间调用self 上的清理方法是否可以接受,或者我应该在我的-dealloc 中复制该功能?

【问题讨论】:

【参考方案1】:

是的,您可以从 dealloc 方法内部调用方法,但谨慎行事是明智的。您应该调用的only 方法几乎应该是“拆除”方法,或者有助于在回收对象之前清理对象的方法。其中一些清理方法包括:

通过通知中心取消注册通知 将自己移除为键值观察者 其他一般清理方法

但是请注意,在这些方法中的每一个中,您的对象都将处于不一致的状态。它可能被部分释放(某些 ivars 可能/将是无效的),因此您应该永远依赖特定的对象状态。这些方法应该用于继续解构对象状态。

这是我们不鼓励在dealloc 中使用属性设置器(setFoo: 方法)的根本原因:另一个对象可能被注册为观察者,使用该属性将触发 KVO 通知,如果观察者期望对象有一个有效的状态,他们可能会运气不好,事情会很快爆发。

TL;DR:

是的,只要你聪明,它是安全的。

【讨论】:

很好,谢谢戴夫。这正是我想要称呼的:一种没有副作用的拆卸方法。但我对未来可能的重构增加责任感到紧张。我可以保证我知道它现在在做什么,但有时未来的我可能会变得愚蠢。也许我只是说服了自己。 @Don:拆卸方法非常好,特别是如果它有助于促进 DRY 原则。 是否建议调用关闭数据库连接或删除-dealloc中的临时文件的方法,或者是否有更合适的地方来处理这些事情? @dreyln 在dealloc 中似乎是一件合理的事情 数据库连接等应该提前关闭,因为无法保证何时会调用dealloc。甚至根本不能保证会调用 dealloc(如果您退出应用程序,所有对象都会消失而不会调用 dealloc)。

以上是关于在 dealloc 中调用 self 的方法的主要内容,如果未能解决你的问题,请参考以下文章

ARC:没有调用 Dealloc

-dealloc 方法在拥有数组 dealloc'd 时不被调用...应该吗?

dealloc方法

对象被释放但没有调用 dealloc

Viewcontroller Dealloc 方法永远不会被调用

dealloc时取weakself引起崩溃