我已经调试了一段时间的应用,并准备将其上传到应用商店。但是,我仍然会偶尔遇到难以复制或调试的崩溃 - 例如在按怪异序列按下按钮时。如果我把这些序列写下来,我可以调试但不可避免地会在我没有写下来时发生,而这些很难复制。
我知道我需要将其称为一天,并为将来的版本留下未来的错误修复程序。我删除了测试中的所有abort()语句。但是,偶尔而不是让崩溃让你只关闭应用程序并重新打开,我会得到一个无法重新安装就无法打开应用程序的崩溃。例如,这恰好发生了,带有
'NSGenericException',原因:'*** Collection< __ NSCFSet:0x174a41b90>在被列举时被突变。'
这是因为在后台同步到云期间将VC切换。
我可以使用崩溃,只需要重新打开,但不能使应用程序无法使用。是否有关于崩溃类型的指导方针,以帮助您专注于真正致命的崩溃?
或者你能做些什么来阻止崩溃应用程序崩溃?
答案 0 :(得分:3)
你应该解决这个问题。由于您的崩溃日志中包含该错误消息,因此您知道哪种方法可以引发问题,因此即使问题本身不一致和/或以各种方式出现问题,您仍然可以很好地开始修复问题。
但偶尔的崩溃可能看起来不会对您造成太大的不便,但这是一星评价和不满意客户的最快捷方式。我怀疑你会很快后悔分发一个已知的,易于复制的崩溃的应用程序。
但是,有一些观察:
听起来您的后台更新过程正在改变主线程使用的模型对象。
如果可能,我建议小心不要在后台线程中更改任何模型对象,而是填充局部变量,当您准备好相应地更新UI时,同时调度两者模型更新和UI刷新到主线程。
如果由于某种原因无法执行此操作,则必须将模型更新的所有交互与某些机制(例如锁,GCD串行队列,读写器模型等)同步。这是稍微复杂的方法,但是可以做到。
我建议暂时编辑目标的“方案”,然后打开线程消毒器:
它可能有助于您识别并更轻松地重现这些问题。您可以越轻松地重现问题,就越容易解决问题。
你说:
或者你能做些什么来阻止崩溃应用程序崩溃?
听起来“保存”操作以某种方式将结果以内部不一致的方式留在持久存储中。以下任何一个都会有所帮助,但我建议你尽可能做到这三个:
冒着重复自己的风险,修复崩溃(消除问题的根源总是比尝试编写问题的表现形式更好);
根据您保存结果的方式,您可以使用atomic
保存操作,以便在中途失败时,不会使其处于不一致状态;如果没有看到代码片段说明你如何保存结果,我们无法建议你应该怎么做,但它通常是一个选项;
确保,如果读取持久存储的“加载”进程可能失败,那么它会优雅地执行,而不是崩溃;看看你是否可以在启动期间应用程序失败的状态下获取它,然后仔细调试启动过程中发生的事情,导致应用程序在持久存储中使用此特定数据集失败。在“设备”部分,可以选择下载与应用关联的数据,以便您可以仔细诊断正在发生的事情。