0

我打开了一个旧的 iOS 项目,就像 2010 年的 iOS 3 一样旧,发现它在启动时崩溃了。例外是:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'This coder requires that replaced objects be returned from initWithCoder:'

我现在已经搞砸了这个项目几个小时,试图找出导致它的原因。我觉得我已经耗尽了我的智慧和资源,没有从头开始重新做大部分应用程序。关于可能是什么原因的任何想法?

我的调查结果:

该项目是对 AppStore 中现有内容的全新 git checkout。是的,该应用程序非常简单,可以在 2 年内无需任何更新即可正常运行。

我更改为使其编译是将基本 SDK 从 4.1(Xcode 中不再可用)更改为 iOS6 并点击运行。项目设置中的目标仍然是 3.0。

我检查了我没有在代码中的任何地方调用或实现 initWithCoder。我的代码中指示的行只是对 main.m 中的 UIApplicationMain() 的调用,这对我没有多大帮助。

该应用程序只有 3 个视图。主要、细节和关于。看起来 MainView 或 MainViewController 包含问题。我从应用程序没有崩溃的结论是: 1.选择在启动时不将其添加到 NavigationController。2.选择添加 AboutController。

我怀疑问题出在 Xib 文件而不是控制器或视图代码上,因为我可以使用 AboutView Xib 初始化 MainViewController 并启动应用程序。

我想知道我是否可以“修复”这个 Xib,或者我是否必须创建一个新的并重新布局 GUI 元素?这是我唯一的出路,我害怕。该应用程序很简单,但重新布局主要(也是最密集的)视图仍然需要一些时间。此外,我更愿意知道问题出在哪里,而不是重新开始,可能有一天会再次陷入同样的​​境地。

我在正确的轨道上吗?有没有办法追踪有问题的代码或 GUI 小部件?

提前感谢您的任何建议。

更新:在新的 Xib 中重新创建 UI 的基础知识并使用该应用程序后,该应用程序可以正常工作。仍然想知道我是否可以通过更改其中的某些设置或其他设置来修复旧的。

4

2 回答 2

1

我可以想到两种可能导致这种情况,.xib 文件有一些格式问题,或者您在此 .xib 中使用了一个贬值的对象,因此 SDK 不再具有 .xib 所需的特定 initWithCoder: 方法。

要使 Xcode 重写文件并可能修复任何格式问题,请更改文档版本。在 Xcode 中选择 .xib 文件并显示实用程序窗格的文件检查器选项卡以访问版本设置。

对于另一种可能性,我将对您的 .xib 执行手动二进制搜索以查找违规对象。删除一半的对象并运行应用程序。如果它有效,您删除了坏对象。我相信你明白了。可能有不止一个这样的坏对象,但您应该能够相当快地找到一个,弄清楚如何更新它,然后修复其他类似的对象。

于 2012-11-08T16:30:47.553 回答
1

在 Swift 下,这个错误也可能发生,因为init?(coder aDecoder: NSCoder)初始化函数是失败的(如?after init 所示)。在导致初始化程序失败并返回 nil 的情况下,从情节提要或 nib 初始化对象时会引发错误。

于 2016-08-23T07:30:51.943 回答