4

尝试使用 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. 
4

3 回答 3

3

只是想我会分享我对这个 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 中,Reveal the .app in finder,然后 Show Package Contents 以查看其中的所有 .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 文件复制到您的保存目录。

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

于 2012-04-09T14:44:34.980 回答
0

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

这是问题指的是iOS 3.2 SDK Release Notes的文章

于 2012-04-01T12:17:58.957 回答
0

看看这个链接:

解决方案-1:

iOS 和取消归档 xib 文件

在上面的链接中阅读SK9的答案,如下:

我相信这个答案涵盖了 Ikuragames 可能给出的内容(他不在他的电脑附近)。代表他,要解决 Xcode 4.2.1 中的问题,请单击 .xib 文件并在右侧的文件属性面板中,将部署设置为“iOS 3.0”(在我的情况下)并将开发设置为“接口生成器” 3.0”(在我的情况下也是如此)。对项目中的每个 .xib 文件执行此操作。

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

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

在此处输入图像描述

解决方案-2:

查找 objc 运行时数据不安全

在上面的链接中阅读BadPirate的答案,如下所示:

可能是在并行线程中有一个 malloc 正在进行。看看这个家伙的解决方案:http: //www.fatcatsoftware.com/blog/2010/04

解决方案3:

设置基础 SDK 后,iPhone 模拟器在 NSKeyedUnarchiver 中崩溃

在上面的链接中阅读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 解决了这个问题。

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

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

于 2012-04-01T17:04:23.320 回答