我发现执行以下操作可能会使我的 iOS 应用程序崩溃:
- 启动应用
- 退出应用(使用主页按钮)
- 双击home键调出正在运行的任务列表
- 强制关闭我的应用
- 关闭任务列表
- 启动我的应用程序(崩溃)
到目前为止:
- 这只会在我运行调试器时发生在设备(3GS 运行 4.3.1)上
- 我无法通过其他应用实现它
- 并不是每次我都这样做
- 它使 iPhone 处于模糊状态并出现黑屏 - 在 xcode 中结束进程不会将我推回跳板,按主页按钮没有任何效果。我按下电源按钮,然后按下主页按钮,它又回到跳板。
不过,我执行此操作的速度非常快,所以我很好奇它是否可能是我的应用程序中的错误(以及错误可能是什么),或者跳板是否在我重新启动它时杀死了我的应用程序?
调试器报告我的应用程序收到信号“SIGKILL”,所以我倾向于认为这只是实际终止进程的延迟,但我不想忽视我可能犯的一个错误。
鉴于我不能在调试器之外重复它,它对我来说是低优先级的,但如果可能的话,我仍然想更好地理解它,尤其是当它指向我的应用程序中的错误时。
最佳答案
当您终止您的应用程序时,操作系统会向它发送 SIGKILL。通常这会杀死你的应用程序,但由于附加了一个调试器,应用程序被暂停而不是让你有机会调试信号的原因(SIGKILL 可能应该是一个异常(exception),但这不是一个大问题一个)。
当您再次启动它时,SpringBoard(主屏幕)注意到该应用程序没有死并切换到它。 [1] 此时,由于应用已暂停,因此它无能为力。我认为 SpringBoard 通过向它发送 SIGKILL 并等待该应用程序结束来处理无响应的应用程序,但是 GDB 仍然连接,您的应用程序仍然挂起,并且没有任何反应。
此时我通常会点击 Xcode 的停止按钮,或者如果这不起作用(因为 Xcode 4 是一个有问题的 POC),请拔下手机。
如果您想知道为什么 SpringBoard 不简单地忽略应用程序的旧实例并生成一个新实例:只能运行一个实例。应用程序一直都在做这个假设(例如,没有你的应用程序的另一个实例访问它的数据库),我很确定有一些关于 Mach 端口/引导命名空间/意味着如果有另一个你的应用程序将无法启动的东西复制运行(或者如果系统的一部分认为您的应用程序仍在运行,因为某些事情无法进行清理)。
在较旧的操作系统版本上,如果您的应用程序在退出时花费大量时间(例如保存),退出并快速“重新启动”应用程序将切换到正在退出的应用程序,应用程序将完成退出,然后主屏幕会突然出现。我忘记了我在哪个操作系统版本中看到它,但我认为它是固定的。
关于iphone - 从事件任务中删除应用程序会导致在尝试重新打开应用程序时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5557591/