【问题标题】:Appropriate to delete files or close DB connection in dealloc?适合在dealloc中删除文件或关闭数据库连接吗?
【发布时间】:2011-06-09 18:15:35
【问题描述】:

我知道当对象的保留计数达到零时会调用 dealloc,并且应该在其中释放 iVar,但我想知道它是否也是删除临时文件或关闭数据库连接的合适位置。

具体来说,我有一个 UIViewController 的子类,它在 -viewDidLoad 中创建一个数据库连接,并且通过用户交互,可以创建临时文件。当上述控制器从导航堆栈中弹出时,我想关闭数据库连接并删除临时文件(如果存在)。我应该在 dealloc 中这样做吗?

我的第一个想法是在 -viewDidUnload 中清理这个数据库和文件,但我现在知道这个方法只有在操作系统发出内存警告时才会调用。另一个想法是将它放在 -viewDidDisappear:animated 中,但这种方法的问题是另一个视图可能位于由我的视图控制器控制的视图之上。在那种情况下,我不想关闭数据库连接或清理临时文件。

如果 dealloc 不是合适的位置(这是我的直觉),应该在哪里进行这种类型的清理?我有点讨厌强迫我的视图控制器的父级必须调用一个方法来响应它的子级从导航堆栈中弹出。

【问题讨论】:

    标签: objective-c ios uiviewcontroller dealloc


    【解决方案1】:

    【讨论】:

    • 感谢您的链接;这是非常有用的。我需要找到一种不同的方式来完成我想要的事情
    【解决方案2】:

    您可以在dealloc 中执行此操作,或者如果您在应用生命周期中需要这些文件,请在您的应用委托的applicationWillTerminate: 上执行此操作。 YMMV。

    【讨论】:

    • 感谢您的回复。不,当视图控制器从导航堆栈中弹出时,我绝对希望文件消失并关闭数据库连接。你知道在 dealloc 中清理这些东西是否被认为是不好的做法吗?我看到的所有示例都只发布了 iVars...
    • 我不认为这是不好的做法。但是,我建议创建某种类型的“清理”代码并在您的 dealloc 实现中首先调用它。这将在未来为您提供更多的灵活性。
    【解决方案3】:

    不要不要尝试在视图控制器的dealloc 方法中执行此操作。

    如果视图控制器被保留在您不期望的地方会发生什么? dealloc 方法可能不会被触发,并且您的清理工作永远不会发生。也许您现在编写的代码并非如此,但将来可能会有所改变。

    您是否有任何特定原因要将删除文件和关闭数据库连接与弹出视图控制器联系起来?如果没有,也许您可​​以在查询完成后立即执行此操作,或者在启动/前台打开数据库连接,然后在终止/后台关闭它。

    如果您必须将其绑定到从导航堆栈中弹出的视图控制器,那么您可以从 viewDidDisappear: 调用您的清理方法

    【讨论】:

    • 我的应用程序中基本上只有一个“视图”,其中需要连接到数据库并且查询频繁发生。出于这个原因,我想在视图的生命周期内保持数据库连接打开,然后在用户返回一个级别时关闭它。
    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2011-08-13
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多