使用Xcode 4.3.x为iOS 3.0构build通用应用程序 – NSKeyedUnarchiverexception

尝试使用Xcode 4.3.2构build和debuggingiOS 3.0的通用应用程序。 我从NSKeyedUnarchiver得到一个NSException。 看来这可能与无法读取主.xib文件有关。 我已经看到了这一点: iOS和unarchiving xib文件 – 然而,在这种情况下,它不是清楚的应用程序是通用的(他们的解决scheme不起作用)(注意:他们的解决scheme不工作,因为他们使用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. 

只是想我会分享我的解决scheme,这NSKeyedUnarchiver难以理解的归档xib错误。

我刚刚花了几周的时间把我的头发拉出来,我的解决方法和上面的borrrden很相似(也就是使用旧版Xcode构build的nib文件)。 我尝试了所有我能想到的,没有任何快乐的事情。 (我的其他select是停止使用xib文件并在代码中编写整个UI或停止支持iOS 3.0)

所以,这里是我的情况,我是如何得到解决方法的工作,以及我如何为应用程序商店构buildDistribution Archive。

首先稍微介绍一下背景 :我的应用程序最初是使用Xcode 3.2.5构build的,在iOS 3.0及更高版本上运行良好。 当我升级到Xcode 4.2时,一旦应用程序加载了一个xib文件,我得到了NSKeyedUnarchiver错误。 经过一番谷歌search,我遇到了这个线程中提到的其他文章,所以我改变了每个xib文件的部署和开发版本。 这工作了一个治疗,直到我升级到Xcode 4.3.1时,错误返回。 我重新检查了所有的xib文件,但没有喜悦。 即使他们被设置为iOS3.0 / IB3.0(我尝试了所有可用的组合),该应用程序仍然崩溃。

为了certificate这是xib文件的一个问题,我尝试在设备(运行iOS 3.0的第二代iPod Touch,通过电缆连接到Xcode)上进行debugging。 但是在debugging器开始之前,应用程序会崩溃。 所以我从项目中移除了MainWindow.xib(在代码中设置了App Delegate和UIWindow)。 这使debugging器开始,并打我的第一个断点(应用程序的第一行:didFinishLaunchingWithOptions),但应用程序将挂起而不会抛出一个exception,只要我推一个ViewController。 经过大量的挖掘,我把debugging器从LLDB切换到GDB(从Products – > Edit Scheme)。 这阻止了应用程序挂起,抛出exception,因为我预料它应该(难以理解的档案之一)。 LLDB显然仍然有问题。

经过几个星期拉出我的头发,唯一有用的工作是使用旧版本的Xcode构build的笔尖文件。 幸运的是我的Xcode 3.2.5坐在我的机器上。 以下是我用来实现这一function的步骤,并允许为app store构build存档:

  • 退出Xcode 4.3.1并启动Xcode 3.2.5。
  • 创build一个新的基于视图的应用程序项目,并将主项目中的所有.xib文件添加到该项目中。
  • 将部署目标设置为iOS3.0,然后在设备上执行“发布生成并运行”(如果不自动select此configuration文件,请使用您的通用configurationconfiguration文件)
  • 在Xcode中,在finder中显示.app,然后显示包内容以查看其中的所有.nib文件(Xcode已将.xib文件转换为.nib文件)。
  • 为了便于使用,请将.nib文件复制到另一个目录。
  • 退出Xcode 3.2.5并启动Xcode 4.3.1并打开你的项目。
  • 访问每个xib,然后从右侧的边栏中取消select您的应用程序(这意味着Xcode将不会使用这些.xib文件作为最终的包)。
  • 现在将所有新的.nib文件(由Xcode 3.2.5生成)添加到您的项目中(整齐地将它们放在一个自己的组中)。
  • 现在,您可以按照自己喜欢的方式进行清理,构build和运行,甚至为应用程序商店构build归档文件。

为了certificate正在使用正确的.nib文件,请使用terminal中的md5。 在Finder中显示您的.app(或从pipe理器存档)以查看Xcode创build的位置,然后显示包内容以查看.nib文件。 将md5校验和与Xcode 3.2.5创build的.nib文件进行比较。

只要记住,任何时候你修改一个xib,它将不会被使用,直到你从Xcode 3.2.5构build。 并将生成的.nib文件复制到您的保存目录。

这是不理想的,如果任何人有更好的解决scheme,我会热衷于听到它。 在此期间,我希望这有助于。

我想我明白了。 3.2之前的iOS不支持XIB格式,因此您需要先将其转换为旧的NIB格式,如下所示: 加载主XIB使iOS 3.0上的应用程序崩溃

这里是关于iOS 3.2 SDK发行说明的文章

看看这个链接:

SOLUTION-1:

iOS和unarchiving xib文件

在上面的链接中阅读SK9的回答,内容如下:

我相信这个答案涵盖了Ikuragames可能给的(他不在他的电脑附近)。 为了解决这个问题,在Xcode 4.2.1中点击.xib文件,在右边的文件属性面板中,将部署设置为“iOS 3.0”(在我的情况下),开发为“Interface Builder 3.0“(在我的情况下)。 为项目中的每个.xib文件执行此操作。

值得一提的是,Xcode 4.2.1可能会在这里configuration默认的“iOS 5.0”,以匹配当前的SDK,而“Xcode 4.1”则为文档types。 为什么Xcode不仅仅将部署目标与项目部署目标相匹配我不确定…

如果这仍然不起作用,或者你在这个阶段非常偏执,加载NSKeyedUnarchiver文件时捕获NSKeyedUnarchiver引发的exception,然后以编程方式创build视图。

在这里输入图像说明

SOLUTION-2:

查找objc运行时数据不安全

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

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

SOLUTION-3:

设置基本SDK后,iPhone Simulator在NSKeyedUnarchiver中崩溃

在上面的链接中阅读弗洛里安的答案,内容如下:

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

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

让我知道如果你需要更多的帮助。

这个解决scheme应该可以帮助