0

哪种方法最好

覆盖目标c中的“release”或“dealloc”方法?

为什么?

4

4 回答 4

3

哪种方法最好?覆盖releaseordealloc方法?

- dealloc, 确实。你永远不应该覆盖- release.

为什么?

一,因为release做了一堆内部的东西。二、因为ifrelease被调用,并不代表对象被释放。

因此,您会意外释放您的 ivars 或使您的属性无效。当我们可以拥有世界和平时,谁想要一个丑陋的段错误?

如果一个对象真的被释放,- dealloc将被调用。

于 2012-11-26T10:41:23.263 回答
3

在非 ARC 下,99% 的情况下您不应该覆盖 release 方法。

我只见过一种需要覆盖释放方法的情况——一种单例,无论你调用多少次 alloc,它都会强制类有一个真正的单个实例。

这样不仅会覆盖release方法,而且会覆盖allowWithZone:, retain, 'retainCount` 等(实际上实现那种单例并不常见)

于 2012-11-26T10:54:35.310 回答
0

如果你不使用 ARC,你应该重写-[MyObject dealloc]dealloc 方法来释放你的对象内的所有保留对象。我从未发现需要覆盖 release 方法的情况。

如果您使用 ARC,通常可以完全避免覆盖 -dealloc 方法,除非您使用 ARC 不会释放的任何东西,例如 sqlite 指针或其他东西。

于 2012-11-26T10:38:17.997 回答
0

不要覆盖与内存管理无关的任何内容- 您甚至不会在何时以及是否调用这些方法。

何时应该解除分配的例外情况:

  • 移除 KVO / 通知中心观察者
  • 释放手动分配的内存(弧)/释放您的 ivars(非弧)
于 2012-11-26T12:56:10.713 回答