objective-c:依赖dealloc

标签 objective-c object memory-management automatic-ref-counting

依赖确定性 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/

相关文章:

objective-c - 更改 Popover 内的 View 外观?

javascript - 将测验问题存储在对象数组中

java - 我的代码中的逻辑错误

c++ - std::string 内存管理

iphone - NSString 比较不起作用

ios - 如何从 json 的本地文件检索数据到 Objective C iOS 中的字典

javascript - 动态到达时,JSON 对象属性为 "undefined"

c++ - 对使用多个内存池的类使用工厂是否合适?有更好的模式/技术吗?

.net - 制作内存密集型后台应用程序 "friendly"

ios - 从服务器下载数据并在 UITableViewController 或 UIViewController 中显示而不会卡住其 GUI 的最佳方法是什么?