【问题标题】:Build universal app for iOS 3.0 using Xcode 4.3.x - NSKeyedUnarchiver Exception使用 Xcode 4.3.x 为 iOS 3.0 构建通用应用程序 - NSKeyedUnarchiver 异常
【发布时间】:2012-04-15 05:45:26
【问题描述】:

尝试使用 Xcode 4.3.2 构建和调试适用于 iOS 3.0 的通用应用程序。我从 NSKeyedUnarchiver 收到 NSException。似乎这可能与无法读取主 .xib 文件有关。我已经看到了这个:iOS and unarchiving xib files - 但是,在这种情况下,不清楚该应用程序是通用的(他们的解决方案不起作用)(注意:他们的解决方案不起作用,因为他们使用的是 Xcode 4.2,而不是 4.3) .

这是错误输出:

2000-01-01 11:00:39.-19 myApp[664:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x4e, 0x49, 0x42, 0x41, 0x72, 0x63, 0x68, 0x69)'
2000-01-01 11:00:39.-01 myApp[664:207] Stack: (
        808001701,
        805397928,
        807551015,
        807550919,
        810902709,
        815043196,
        815042704,
        814682908,
        814682012,
        814970032,
        814968048,
        814966908,
        839149932,
        807750263,
        807747947,
        814678868,
        814672532,
        12253,
        12124
    )
    terminate called after throwing an instance of 'NSException'
    Not safe to look up objc runtime data. 

【问题讨论】:

  • 所以为了清楚起见,您已将所有 XIB 文件设置为该答案中指示的设置?
  • 我不知道你是否必须 - 但我确实将每个文件的部署和开发都设置为 3.0。我还尝试将 iPad .xibs 设置为 3.2。无论如何,在 iOS 3.0 上调试时出现上述错误。
  • 3.2 仍然大于 3.0。如果这是可以达到的最低值,那么您可能必须考虑将 XCode 降级到 4.2.1 才能匹配该答案中显示的设置。如果你不想降级,那么你必须考虑提高你的最低 iOS 版本,我猜。
  • 您误会了——我将所有 .xib 设置为 3.0 以进行部署和开发。我还尝试仅将 iPad .xibs 设置为 3.2(因为那是第一个支持 iPad 的操作系统)。这些都不起作用。

标签: ios xcode nsexception


【解决方案1】:

我只是想分享我对这个 NSKeyedUnarchiver 难以理解的存档 xib 错误的解决方案。

我刚刚花了几个星期的时间来解决这个问题,我的解决方法与上面的 borrrden 几乎相同(即使用使用旧版本 Xcode 构建的 nib 文件)。我尝试了所有我能想到的一切,没有任何快乐。 (我的其他选择是停止使用 xib 文件并用代码编写整个 UI 或停止支持 iOS 3.0)

所以,这就是我的情况,我是如何让变通办法起作用的,以及我是如何为应用商店构建分发存档的。

首先介绍一点背景:我的应用最初是使用 Xcode 3.2.5 构建的,并且在 iOS 3.0 及更高版本上运行良好。当我升级到 Xcode 4.2 时,一旦应用程序加载了 xib 文件,我就会收到 NSKeyedUnarchiver 错误。经过一番谷歌搜索后,我发现了该线程中提到的其他文章,因此我更改了每个 xib 文件的部署和开发版本控制。这很有效,直到我升级到 Xcode 4.3.1 时错误返回。我重新检查了所有的 xib 文件,但没有任何乐趣。即使它们是为 iOS3.0/IB3.0 设置的(我尝试了所有可用的组合),应用程序仍然崩溃。

为了证明这是我尝试在设备上调试的 xib 文件的问题(运行 iOS 3.0 的第二代 iPod Touch,通过电缆连接到 Xcode)。但是应用程序会在调试器启动之前崩溃。所以我从项目中删除了 MainWindow.xib(在代码中设置 App Delegate 和 UIWindow)。这允许调试器启动并命中我的第一个断点(应用程序的第一行:didFinishLaunchingWithOptions),但只要我推送 ViewController,应用程序就会挂起而不会引发异常。经过大量挖掘后,我将调试器从 LLDB 切换到 GDB(从 Products -> Edit Scheme)。这阻止了应用程序挂起并抛出了我预期的异常(难以理解的存档)。 LLDB 显然仍然存在问题。

经过几周的努力,唯一可行的方法是使用使用旧版本 Xcode 构建的 nib 文件。幸运的是,我的机器上还有 Xcode 3.2.5。以下是我用来完成这项工作并允许为应用商店构建存档的步骤:

  • 退出 Xcode 4.3.1 并启动 Xcode 3.2.5。
  • 创建一个新的基于视图的应用程序项目并将主项目中的所有 .xib 文件添加到其中。
  • 将部署目标设置为 iOS3.0,然后在设备上执行发布构建和运行(如果没有自动选择,请使用您的通用配置文件)
  • 在 Xcode 中,在 finder 中显示 .app,然后显示包内容以查看其中的所有 .nib 文件(Xcode 已将 .xib 文件转换为 .nib 文件)。
  • 为方便使用,请将 .nib 文件复制到另一个目录。
  • 退出 Xcode 3.2.5 并启动 Xcode 4.3.1 并打开您的项目。
  • 访问每个 xib 并从右侧边栏中从 Target Membership 中取消选择您的应用(这意味着 Xcode 将将这些 .xib 文件用于最终包)。
  • 现在将所有新的 .nib 文件(由 Xcode 3.2.5 生成)添加到您的项目中(为了简洁起见,请将它们放在自己的组中)。
  • 现在您可以随心所欲地清理、构建和运行,甚至可以为应用商店构建存档。

要证明正在使用正确的 .nib 文件,请从终端使用 md5。在 Finder 中显示您的 .app(或来自 Organizer 的存档)以查看 Xcode 在何处创建它,然后显示包内容以查看 .nib 文件。将 md5 校验和与 Xcode 3.2.5 创建的 .nib 文件中的校验和进行比较。

请记住,任何时候您修改 xib 时,它都不会被使用,除非您从 Xcode 3.2.5 构建。并将生成的 .nib 文件复制到您的保存目录。

这并不理想,如果有人有更好的解决方案,我会很高兴听到它。与此同时,我希望这会有所帮助。

【讨论】:

  • 谢谢-希望我上周看到了。我按原样在 3.1.2+ 上尝试了我所拥有的东西,并且它起作用了,所以最终将我的目标设置为 3.1。我实际上打算尝试类似你写的东西,但是我的旧 Xcode 不能在 Lion 上运行,所以我放弃了。您在 Lion 上运行 Xcode 3.2.5 时遇到任何问题吗?
  • Xcode 3.2.5 on Lion 对我来说效果很好,但你仅限于 iOS4 SDK,否则我会坚持使用它。我也曾一度按照你的路线走,但我在将 iOS 3.1.2 安装到设备上时遇到了问题,所以我放弃了。你知道苹果是否有这些旧固件可供下载?
  • 在那里安装 3.1.2 很痛苦 - 发布一个新问题,我会回答,所以我可以关闭它。将链接作为评论粘贴到此处。
【解决方案2】:

查看此链接:

解决方案-1:

iOS and unarchiving xib files

阅读上述链接中SK9的回答,如下:

我相信这个答案涵盖了 Ikuragames 可能给出的内容(他是 不在他的电脑附近)。代表他解决Xcode中的问题 4.2.1 单击 .xib 文件并在右侧的文件属性面板中,将部署设置为“iOS 3.0”(在我的情况下)和 开发到“Interface Builder 3.0”(同样在我的情况下)。这样做是为了 项目中的每个 .xib 文件。

值得记住的是,Xcode 4.2.1 可能会很好地设置默认值 此处部署“iOS 5.0”,以匹配当前 SDK,以及 文档类型为“Xcode 4.1”。为什么 Xcode 不只是匹配 项目部署目标的部署目标我不确定...

如果这仍然不起作用,或者您在这个阶段非常偏执, 在加载时捕获由NSKeyedUnarchiver 引发的异常 .xib 文件并在那里以编程方式创建视图。

解决方案-2:

Not safe to lookup objc runtime data

阅读上面链接中BadPirate的回答,如下:

可能是并行线程中正在进行 malloc。查看 解决这个问题:http://www.fatcatsoftware.com/blog/2010/04

解决方案-3:

iPhone Simulator chrashes in NSKeyedUnarchiver after setting base SDK

阅读上述链接中Florian的回答,如下:

我用这个详细的堆栈跟踪解决了这个问题:

#0  0x302ac924 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___  
#1  0x904a3509 in objc_exception_throw  
#2  0x3028e5fb in +[NSException raise:format:arguments:]  
#3  0x3028e55a in +[NSException raise:format:]  
#4  0x30513b77 in -[NSKeyedUnarchiver initForReadingWithData:]  
#5  0x30ab4b2a in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:]  
#6  0x30ab6eb3 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:]  
#7  0x308f85f1 in -[UIApplication _loadMainNibFile]  
#8  0x30901a15 in -[UIApplication _runWithURL:sourceBundleID:]  
#9  0x308fef33 in -[UIApplication handleEvent:withNewEvent:]  
#10 0x308fad82 in -[UIApplication sendEvent:]  
#11 0x309013e1 in _UIApplicationHandleEvent  
#12 0x32046375 in PurpleEventCallback  
#13 0x30245560 in CFRunLoopRunSpecific  
#14 0x30244628 in CFRunLoopRunInMode  
#15 0x308f930d in -[UIApplication _run]  
#16 0x309021ee in UIApplicationMain  
#17 0x0000255c in main at main.m:14   

应用程序在调用 mainNibFile 时崩溃。而且我不知道为什么,只是简单地重新保存 MainWindow.xib 解决了问题。

如果您需要更多帮助,请告诉我。

这个解决方案应该可以帮助你。

【讨论】:

  • 我已经发布了链接,并从链接中复制了已接受的答案,只是为了确保如果此链接由于某种原因而关闭,我的答案不会变得无用。我以粗体添加他们的名字来感谢原始海报。
  • Parth,感谢您对此进行调查。第一个链接与我在问题中提到的相同。我也看到了最后一个,但后来在 cmets 中,评论者撤回了他说它有效的声明。无论如何,我确实尝试加载并重新保存,但没有帮助。你能让 Xcode 4.3 在 iOS3.0 上运行应用程序吗?
  • @windup:在我的第一个 SOLUTION-1 中,您需要将 Deployment 从界面生成器更改为 iOS 3.2。我认为这应该对您有所帮助。
  • 我已经尝试将 Development 和 Deployment 都设置为 3.0。我还尝试将 iPad .xibs 设置为 3.2 以进行开发和部署。您建议将所有 .xib 设置为 3.2 以进行开发和部署,即使我的目标 SDK 是 3.0?
【解决方案3】:

我想我明白了。 3.2 之前的 iOS 不支持 XIB 格式,因此您需要先将其转换为旧的 NIB 格式,如此答案:Loading main XIB makes app crash on iOS 3.0

这里是问题参考iOS 3.2 SDK Release Notes的文章

【讨论】:

  • 我查看了发行说明中标题为“Interface Builder”的部分。它指出了两个构建设置“Flatten..”和“Strip”。在 Xcode 4.3 中,我看到了 Flatten 设置,但这已经是肯定的。我没有看到 Strip 设置,但会假设如果它在那里,那就是肯定的,因为我没有使用任何本地化。我错过了什么吗?
  • 你不想把它弄平,这就是问题所在:D。
  • 我阅读它的方式是让 xib 保持不展平和不剥离的能力是 3.2 中的新功能,但默认情况下是像 3.2 之前所做的那样展平和剥离。无论如何,我尝试将 Flatten 选项设置为 NO,而不是上面的错误,我得到:Failed to load NSMainNibFile MainWindow_Phone.
  • 该错误消息不是很有帮助:-S...我假设您尝试清理并重新安装项目?除了那条消息,您还能找到其他信息吗?
  • 不幸的是,不,这就是我所得到的。是的,清洁和重新安装。你能让 Xcode 4.3 在 iOS 3.0 上运行代码吗?
猜你喜欢
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多