尝试使用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.
答案 0 :(得分: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,app就会挂起而不会抛出异常。经过大量挖掘后,我将调试器从LLDB切换到GDB(来自Products - > Edit Scheme)。这阻止了应用程序挂起并按照我的预期抛出异常(难以理解的存档)。 LLDB显然仍有问题。
经过几周的拔毛之后,唯一有用的就是使用旧版Xcode构建的nib文件。幸运的是我仍然有Xcode 3.2.5坐在我的机器上。以下是我使用此步骤的步骤,并允许为应用商店构建存档:
要证明正在使用正确的.nib文件,请使用终端中的md5。在Finder中显示您的.app(或来自管理器的存档)以查看Xcode创建它的位置,然后显示包内容以查看.nib文件。将md5校验和与Xcode 3.2.5创建的.nib文件进行比较。
请记住,每次修改xib时,它都不会被使用,直到你从Xcode 3.2.5构建。并将生成的.nib文件复制到您的保留目录。
这并不理想,如果有人有更好的解决方案,我会热衷于听到它。与此同时,我希望这会有所帮助。
答案 1 :(得分:0)
我想我明白了。 3.2之前的iOS不支持XIB格式,因此您需要先将其转换为旧的NIB格式,如以下答案所示:Loading main XIB makes app crash on iOS 3.0
以下是问题涉及iOS 3.2 SDK Release Notes
的文章答案 2 :(得分:0)
查看以下链接:
<强> SOLUTION-1:强>
在上面的链接中阅读 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文件,并以编程方式创建视图。
<强> SOLUTION-2:强>
Not safe to lookup objc runtime data
在上面的链接中阅读 BadPirate 的回答,如下所示:
可能是在并行线程中有一个malloc正在运行。校验 这个家伙解决方案:http://www.fatcatsoftware.com/blog/2010/04
<强> SOLUTION-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解决了这个问题。
如果您需要更多帮助,请与我联系。
此解决方案可以为您提供帮助。