为什么我的程序在从最近的应用程序栏中删除后重新启动时崩溃?

问题描述:

我有点编程新手很抱歉,如果这说明我的无知,为什么我的程序在从最近的应用程序栏中删除后重新启动时崩溃?

情况1:

  • 我的程序是在模拟器中运行。我按下主页按钮,然后再按下我的程序图标,然后回到原来的位置。这很明显 - 它已被iPhone的多任务系统所冻结。

情况2:

  • 我的程序是在模拟器中运行。我按主页按钮,但这次我双击该程序并从最近的应用程序栏中删除它。然后我按下该程序的图标再次启动它。

在情况2中,我希望我的程序只是从一开始就加载,但是它会返回到它被“冻结”的页面,简要地说,在崩溃之前。

这是为什么?

编辑 - 这是坠机的回溯。我曾与一个完全干净的做到了我的应用程序没有安装数据,从你看到的第一个画面,让变量到最低限度:

#0 0x96dc009a in mach_msg_trap() 
#1 0x96dc0807 in mach_msg() 
#2 0x0111cd86 in __CFRunLoopServiceMachPort() 
#3 0x01079e74 in __CFRunLoopRun() 
#4 0x01079840 in CFRunLoopRunSpecific() 
#5 0x01079761 in CFRunLoopRunInMode() 
#6 0x01c821c4 in GSEventRunModal() 
#7 0x01c82289 in GSEventRun() 
#8 0x001c4c93 in UIApplicationMain() 
#9 0x00002429 in main (argc=1, argv=0xbffff050) at main.m:14 
+0

它在哪里崩溃,在'application:didFinishLaunchingWithOptions:'?让我们回到这里。 – 2011-05-17 16:26:44

+0

@Daniel明白了!往上看。 – 2011-05-18 07:13:24

+1

从这个回溯中无法真正分辨出来。我想到的一个问题是:你是否正在运行Xcode调试器?这可能是因为当你杀死应用程序时,调试器会阻止进程被完全销毁,导致后续启动时崩溃。如果您最初从模拟器启动应用程序而不是通过Xcode的调试器,它会正常工作吗? – 2011-05-18 13:04:07

复制评论,因为这个理论看起来是正确的:你是否正在运行Xcode调试器?这可能是因为当你杀死应用程序时,调试器会阻止进程被完全销毁,导致后续启动时崩溃。如果你最初从模拟器启动应用程序,而不是通过Xcode的调试器,它显然会正常工作。

+0

感谢您的帮助! – 2011-05-18 14:03:07

当你的应用从应用程序切换终止,它调用您的应用程序代理的方法为applicationDidEnterBackground:(UIApplication *)application。在这里你应该保存所有的应用程序状态 - 你的应用程序使用的所有内存都将被释放。可能发生的情况是,您的applicationDidEnterBackground:方法中的某些内容崩溃或者大量释放对象模型中的某个内容导致崩溃。

编辑:

我只是重读你的问题,看到它崩溃的重新开张。抱歉。您还应该检查application:didFinishLaunchingWithOptions:是否发生崩溃,因为您的应用第一次启动时会调用该命令。虽然自从在应用程序关闭之前看到最后一个屏幕,但崩溃似乎仍然可能与终止绑定在一起。

如何获得回溯:如果您在Xcode调试运行在模拟器中的代码,重现此崩溃

,你应该能够发现哪些行崩溃。当调试器启动崩溃并启动gdb(您应该在Xcode中看到一个(gdb)提示符),键入bt,然后按回车键查看崩溃的回溯。粘贴在这里。

See the docs of UIApplicationDelegate欲了解更多关于applicationWillTerminate:的信息。

+0

谢谢 - 请参阅上面的回溯。 – 2011-05-18 07:14:19

+2

只是想指出这个答案中的第一句话是不正确的:'applicationWillTerminate:'当你的应用在后台被终止时将不会被调用。相反,你的应用程序不会再被抛弃。这就是为什么你需要确保在'application:didEnterBackground:'保存任何持久数据。 – 2011-05-18 13:00:21

+0

@丹尼尔 - 你说的对,我的错。更新的答案反映了这一点。 – kevboh 2011-05-18 13:24:11

我有同样的问题。出于某种原因,模拟器阻止我们杀死我们正在测试的应用程序。 我为测试做的一件事是创建一个虚拟项目到 如果从另一个虚拟项目启动模拟器。 然后我可以在我的原始项目中打开/关闭/终止测试通知等。

拔下手机,是的。调试器GDB是造成这个问题的原因。