在obj-c中关闭sqlite3连接的最佳位置是什么?

时间:2011-12-13 10:56:39

标签: objective-c ios xcode sqlite

我正在AppDelegate.m中打开数据库连接

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

我正在关注applicationWillTerminate

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
    NSLog(@"Closing DB");
    if(database) sqlite3_close(database);
}

但是当我在模拟器上关闭(真正关闭)应用程序时,我没有在控制台中获得日志“Closing DB”。这是正常的吗?

在Objective-c中关闭sqlite3连接的最佳位置是什么?

(非常接近意味着

- 双击“主页”按钮以显示“多任务”栏 - 按住多任务栏上的任意位置,直到其上的图标开始摆动。 - 当他们摆动时,每个图标上方都有一个减号符号。 - 按任意应用程序上方的减号符号将其关闭。)

2 个答案:

答案 0 :(得分:1)

这是因为您的申请没有终止。它进入了背景。尝试将您的代码添加到applicationDidEnterBackground

答案 1 :(得分:1)

尽量避免使用 - applicationWillTerminate:方法,因为您没有足够的时间(!)来正确地完成工作 - 也许系统正在重新启动或关闭。保存数据和清除未使用资源(如果需要)的最佳做法是将代码放入 - applicationDidEnterBackground:方法。

来自Apple的UIApplicationDelegate协议参考:

  

此方法的实现大约需要五秒钟   执行任何任务并返回。如果您需要额外的时间来执行   任何最终任务,您都可以从中请求额外的执行时间   系统通过调用beginBackgroundTaskWithExpirationHandler:。在   练习,你应该从applicationDidEnterBackground:as返回   尽快。如果方法在时间运行之前没有返回   你的申请被终止并从内存中清除。

     

您应该执行与调整用户界面相关的任何任务   在此方法退出之前,但其他任务(如保存状态)应该   根据需要移动到并发调度队列或辅助线程。   因为它可能是你开始的任何后台任务   applicationDidEnterBackground:直到该方法之后才会运行   退出,您应该在之前请求额外的后台执行时间   开始那些任务。换句话说,先打电话   beginBackgroundTaskWithExpirationHandler:然后在a上运行任务   调度队列或辅助线程。

(c)taken from this answer