使用Xcode 4.3.x构建适用于iOS 3.0的通用应用程序 - NSKeyedUnarchiver Exception

时间:2012-04-01 03:22:56

标签: ios xcode nsexception

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

3 个答案:

答案 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坐在我的机器上。以下是我使用此步骤的步骤,并允许为应用商店构建存档:

  • 退出Xcode 4.3.1并启动Xcode 3.2.5。
  • 创建一个新的基于View的应用程序项目,并将主项目中的所有.xib文件添加到其中。
  • 将部署目标设置为iOS3.0,然后在设备上执行发布构建和运行(如果它没有自动选择,请使用您的通用配置文件)
  • 从Xcode中,在Finder中显示.app,然后显示包内容以查看其中的所有.nib文件(Xcode已将.xib文件转换为.nib文件)。
  • 为便于使用,请将.nib文件复制到另一个目录。
  • 退出Xcode 3.2.5并启动Xcode 4.3.1并打开您的项目。
  • 访问每个xib,然后从右侧边栏中取消选择目标成员资格中的应用程序(这意味着Xcode将将这些.xib文件用于最终包)。
  • 现在将所有新的.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:

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文件,并以编程方式创建视图。

     

enter image description here

<强> 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解决了这个问题。

如果您需要更多帮助,请与我联系。

此解决方案可以为您提供帮助。