7

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

4

1 回答 1

11

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

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

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

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

TL;博士:

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

于 2011-02-23T17:49:15.557 回答