iphone - 从事件任务中删除应用程序会导致在尝试重新打开应用程序时崩溃

标签 iphone objective-c ios ios4

我发现执行以下操作可能会使我的 iOS 应用程序崩溃:

  1. 启动应用
  2. 退出应用(使用主页按钮)
  3. 双击home键调出正在运行的任务列表
  4. 强制关闭我的应用
  5. 关闭任务列表
  6. 启动我的应用程序(崩溃)

到目前为止:

  • 这只会在我运行调试器时发生在设备(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/

相关文章:

javascript - noscript block 内的元视口(viewport)标签

ios - 仅更改我的应用程序的音量

ios - 构建 Profile 时构建时间较长

ios - 使用 UIActivityViewController 分享实时照片

css - Safari/iOS/iPhone 上的 Bootstrap 模式问题

objective-c - 自定义 View 中的中心按钮

ios - 无需登录即可在 Google+ 上分享文本、图片和网址

objective-c - 如何知道在 Objective-C 中哪个方法执行了选择器

iphone - Snow Leopard 上的 iOS SDK 4.3 安装错误

ios - UINaviationItem 中的 UIToolbar 顶部有奇怪的行