加载主XIB使iOS 3.0上的应用程序崩溃

加载主XIB使iOS 3.0上的应用程序崩溃,ios,exception,xcode4.2,xib,ios-3.x,Ios,Exception,Xcode4.2,Xib,Ios 3.x,谢谢你花时间阅读我的问题。 我有这个应用(在Cydia中),大约有10%的用户使用iOS 3.0,所以我想在下一次更新中支持他们 我用运行iOS 4.0和5.0.1的实际设备测试了它;它工作得很好。但在iOS 3.0上,它会崩溃,但有一个例外: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ' -[NSKeyedUnarchiver initForReadingWithData:]:

谢谢你花时间阅读我的问题。 我有这个应用(在Cydia中),大约有10%的用户使用iOS 3.0,所以我想在下一次更新中支持他们

我用运行iOS 4.0和5.0.1的实际设备测试了它;它工作得很好。但在iOS 3.0上,它会崩溃,但有一个例外:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ' -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x4e, 0x49, 0x42, 0x41, 0x72, 0x63, 0x68, 0x69)
0  0x30016588 in objc_exception_throw ()
1  0x30224026 in +[NSException raise:format:arguments:] ()
2  0x30223fc6 in +[NSException raise:format:] ()
3  0x305564b4 in -[NSKeyedUnarchiver initForReadingWithData:] ()
4  0x3094927c in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:] ()
5  0x30949090 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:] ()
6  0x308f131c in -[UIApplication _loadMainNibFile] ()
7  0x308f0f9c in -[UIApplication _runWithURL:sourceBundleID:] ()
8  0x309374b0 in -[UIApplication handleEvent:withNewEvent:] ()
9  0x30936cf0 in -[UIApplication sendEvent:] ()
10 0x3093687c in _UIApplicationHandleEvent ()
11 0x3204696c in PurpleEventCallback ()
12 0x30254a76 in CFRunLoopRunSpecific ()
13 0x3025416a in CFRunLoopRunInMode ()
14 0x308f0354 in -[UIApplication _run] ()
15 0x308eea94 in UIApplicationMain ()
16 0x00003886 in main (argc=1, argv=0x2ffff74c)
显然,在加载主XIB时,以下是异常的回溯:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ' -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x4e, 0x49, 0x42, 0x41, 0x72, 0x63, 0x68, 0x69)
0  0x30016588 in objc_exception_throw ()
1  0x30224026 in +[NSException raise:format:arguments:] ()
2  0x30223fc6 in +[NSException raise:format:] ()
3  0x305564b4 in -[NSKeyedUnarchiver initForReadingWithData:] ()
4  0x3094927c in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:] ()
5  0x30949090 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:] ()
6  0x308f131c in -[UIApplication _loadMainNibFile] ()
7  0x308f0f9c in -[UIApplication _runWithURL:sourceBundleID:] ()
8  0x309374b0 in -[UIApplication handleEvent:withNewEvent:] ()
9  0x30936cf0 in -[UIApplication sendEvent:] ()
10 0x3093687c in _UIApplicationHandleEvent ()
11 0x3204696c in PurpleEventCallback ()
12 0x30254a76 in CFRunLoopRunSpecific ()
13 0x3025416a in CFRunLoopRunInMode ()
14 0x308f0354 in -[UIApplication _run] ()
15 0x308eea94 in UIApplicationMain ()
16 0x00003886 in main (argc=1, argv=0x2ffff74c)

我读过,试过,试过。因此,我的所有NIB部署版本都设置为3.0,开发到Interface Builder 3.0,但仍然没有成功。

在阅读了一些文档后,很明显iOS 3.2之前的版本不会从Xcode 4.2加载NIB,因此,我最终用Xcode 3.2构建了这个项目,并将这些NIB复制到了DerivedData目录下用Xcode 4.2创建的包中,好的方面是我仍然可以用Xcode 4.2调试这个应用程序,坏的方面是,这有点黑客,但我没有选择。谢谢。

我支持上面伊曼纽尔的回答。经过数周的脱发,我想出了以下解决方案:

您有旧的XCode SDK吗?你试过用InterfaceBuilder从这样的sdk打开nib吗?谢谢@Peter,我想有一些进展,我听从了你的建议,幸运的是我可以访问Xcode 3.2,我在那里编译了我的项目,经过一些修复后,它可以在iOS 3.0设备上工作,然后我将完全相同的项目复制到Xcode 4.2,我以前也犯过同样的错误,我想可能是因为新的Xcode编译项目的方式。我不是100%确定,但我想我在什么地方读到过,Xcode 4.2 NIB只能向后兼容到iOS 3.2。我会尝试将最低要求目标设置为3.2,或者尝试使用旧sdk创建的NIB,而不在XCode 4.2中重新编译它们。你是righ@Peter!!根据apple Docs的说法:“iOS 3.2支持加载非压缩的nib文件,但3.2之前的iOS版本不支持。如果您选择构建非压缩的nib文件以支持本地化工作流,您应该在本地化后使用ibtool的--strip命令剥离nib文件,或者临时还原“展平编译的XIB文件”并”剥离NIB文件“构建设置以构建与以前的iOS版本兼容的NIB文件。”我尝试使用该配置。设置,但仍无法加载笔尖。所以我做了一个黑客解决方案,但似乎有效: