我知道当对象的保留计数达到零并且iVars应该在其中释放时调用dealloc,但我想知道它是否也是删除临时文件或关闭数据库连接的适当位置。
具体来说,我有一个UIViewController的子类,它在-viewDidLoad中创建数据库连接,通过用户交互,可以创建临时文件。我想关闭数据库连接并在上述控制器弹出导航堆栈时删除临时文件(如果存在)。我应该在dealloc中这样做吗?
我的第一个想法是在-viewDidUnload中执行此DB和文件清理,但我现在知道只有在OS发出内存警告时才会调用此方法。另一个想法是把它放在-viewDidDisappear:动画,但这种方法的问题是另一个视图可能会在我的视图控制器控制的视图之上。在那种情况下,我不想关闭数据库连接或清理临时文件。
如果dealloc不合适(这是我的直觉),这种清理应该在哪里进行?我有点讨厌强制我的视图控制器的父级必须调用一个方法来响应它的子弹弹出导航堆栈。
答案 0 :(得分:2)
Apple内存管理指南说,没有。
简而言之,不要使用dealloc来管理资源。
答案 1 :(得分:1)
您可以在dealloc
中执行此操作,或者如果您需要应用生命周期中的文件,则可以在您的应用代理applicationWillTerminate:
上执行此操作。 YMMV。
答案 2 :(得分:1)
不尝试在视图控制器的dealloc
方法中执行此操作。
如果视图控制器被保留在某个你不期望的地方,会发生什么? dealloc
方法可能不会被触发,并且您的清理永远不会发生。也许在你现在编写的代码中并非如此,但将来可能会发生一些变化。
是否有任何特定原因要将删除文件和关闭数据库连接绑定到弹出视图控制器?如果没有,也许您可以立即执行此查询已完成,或者在启动/前台打开数据库连接,然后在终止/后台关闭它时可能有意义。
如果您必须将其绑定到从导航堆栈弹出的视图控制器,那么您可以从viewDidDisappear: