我正在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连接的最佳位置是什么?
(非常接近意味着
- 双击“主页”按钮以显示“多任务”栏 - 按住多任务栏上的任意位置,直到其上的图标开始摆动。 - 当他们摆动时,每个图标上方都有一个减号符号。 - 按任意应用程序上方的减号符号将其关闭。)
答案 0 :(得分:1)
这是因为您的申请没有终止。它进入了背景。尝试将您的代码添加到applicationDidEnterBackground
答案 1 :(得分:1)
尽量避免使用 - applicationWillTerminate:
方法,因为您没有足够的时间(!)来正确地完成工作 - 也许系统正在重新启动或关闭。保存数据和清除未使用资源(如果需要)的最佳做法是将代码放入 - applicationDidEnterBackground:
方法。
来自Apple的UIApplicationDelegate
协议参考:
此方法的实现大约需要五秒钟 执行任何任务并返回。如果您需要额外的时间来执行 任何最终任务,您都可以从中请求额外的执行时间 系统通过调用beginBackgroundTaskWithExpirationHandler:。在 练习,你应该从applicationDidEnterBackground:as返回 尽快。如果方法在时间运行之前没有返回 你的申请被终止并从内存中清除。
您应该执行与调整用户界面相关的任何任务 在此方法退出之前,但其他任务(如保存状态)应该 根据需要移动到并发调度队列或辅助线程。 因为它可能是你开始的任何后台任务 applicationDidEnterBackground:直到该方法之后才会运行 退出,您应该在之前请求额外的后台执行时间 开始那些任务。换句话说,先打电话 beginBackgroundTaskWithExpirationHandler:然后在a上运行任务 调度队列或辅助线程。