依赖确定性 dealloc(例如:用于清理)是否合法?
由于 ARC,甚至手动引用计数,本质上是确定性的,我想知道其他人如何看待依赖立即调用 dealloc(相对而言,考虑 autoreleasepool)。
在其他现代编程语言(如 C#)中,当您需要确定性清理时,会采用类似处置的模式。而且我认为带有垃圾收集功能的 Obj-C 也会鼓励这种行为。
因此,话虽如此,一个例子是 UIViewController,它取消了 dealloc 中未完成的操作,而不是试图围绕 viewDidDisappear 有时令人沮丧的语义进行编程。
另一个例子是一个流对象,它分别在 init 和 dealloc 中隐式打开和关闭,而不需要调用 open 或 close。
由于 Apple 已经弃用了 GC,我想这些模式不会很快被打破,而且它们非常方便,尽管我找不到任何关于是否应该鼓励这样做的文档。
最佳答案
你是绝对正确的,你可以依靠 dealloc
在最后一个引用被释放后相对较快地被调用(手动或通过 ARC,这无关紧要)。与 GC 在系统有空闲时间时调用终结器或在某些情况下从不调用终结器不同,dealloc
的调用非常可靠。 Apple 通过建议我们应该在 dealloc
中执行所有资源清理任务来允许甚至鼓励使用这种模式。
然而,这并不意味着您应该完全依赖 dealloc
。例如,看看 NSStream
类:它为您提供了一个明确的close
方法,让您可以随意强制关闭流,而无需等待dealloc
的调用发生。如果资源非常昂贵(文件句柄、信号量等),这是一个非常好的模式:释放这些资源的主要机制应该是一个单独的 close
方法。 dealloc
方法也应该释放资源,但它也应该发出警告,通知您错过了 close
调用。
关于objective-c:依赖dealloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13638325/