所有。由于这个问题,我一直在敲我的头几个小时。我有一个通用项目,是iPhone和iPad项目的混合体。我将这些代码库放在通用项目中,经过大量的“#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
”检查,让项目在iPhone(OS 3.0到3.1.3)和iPad模拟器中运行。在更加了解我加载的外部库的项目设置之后,我将应用程序加载到iPhone(运行OS 3.1.3)上。
然而,当我在iPad上运行应用程序时,我立即收到SIGABRT错误。我尝试在调试下的发布下使用armv6和armv7的 Active Architecture 运行它。我检查并仔细检查了应用程序是否设置了正确的nib文件(但是,再次,此应用程序在模拟器中运行正常)。我已经浏览了我正在使用的外部库,并将它们设置为具有相同的基础SDK (3.2),相同的体系结构(优化(armv6 armv7)),相同的目标设备系列(iPhone / iPad),以及相同的 iPhone OS部署目标(iPhone OS 3.0)。
所以,总结一下......我有一个适用于iPhone和iPad模拟器的通用应用程序,可在真实的iPhone上运行,但不能在iPad上运行。它并没有在iPad上走得太远 - 有一个SIGABRT错误会立即停止执行。帮助??
编辑根据Jason的建议,下面是我的应用程序的堆栈跟踪:
#0 0x30c8e0a0 in __kill ()
#1 0x30c8e096 in kill ()
#2 0x30c8e088 in raise ()
#3 0x30ca2210 in abort ()
#4 0x32944a22 in __gnu_cxx::__verbose_terminate_handler ()
#5 0x335657ca in _objc_terminate ()
#6 0x32942df4 in __cxxabiv1::__terminate ()
#7 0x32942e48 in std::terminate ()
#8 0x32942f18 in __cxa_throw ()
#9 0x335646aa in objc_exception_throw ()
#10 0x32c91c9c in -[NSException raise] ()
#11 0x32b57db2 in -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] ()
#12 0x32b1b9da in _NSSetUsingKeyValueSetter ()
#13 0x32b1ae40 in -[NSObject(NSKeyValueCoding) setValue:forKey:] ()
#14 0x32b1adac in -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] ()
#15 0x315db6b6 in -[UIRuntimeOutletConnection connect] ()
#16 0x32c27bc6 in -[NSObject performSelector:] ()
#17 0x32c25a18 in -[NSArray makeObjectsPerformSelector:] ()
#18 0x315d5746 in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:] ()
#19 0x315d53c0 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:] ()
#20 0x314d5d50 in -[UIApplication _loadMainNibFile] ()
#21 0x314d5a7e in -[UIApplication _runWithURL:payload:launchOrientation:] ()
#22 0x31521962 in -[UIApplication handleEvent:withNewEvent:] ()
#23 0x315212e0 in -[UIApplication sendEvent:] ()
#24 0x31520d2a in _UIApplicationHandleEvent ()
#25 0x30d62b32 in PurpleEventCallback ()
#26 0x32c23d9c in CFRunLoopRunSpecific ()
#27 0x32c234e0 in CFRunLoopRunInMode ()
#28 0x314d54a8 in -[UIApplication _run] ()
#29 0x314d39f2 in UIApplicationMain ()
#30 0x00002f62 in main (argc=1, argv=0x2ffff5d8)
正如您所看到的,它不会脱离main.m中的主要功能。
答案 0 :(得分:2)
这看起来在主Nib文件中有一些连接,它指向正在加载的代码中的不存在的插座。确保加载与平台匹配的Nib文件,该文件与正在加载的代码同步。
如果您要通过#if __IPHONE_...
删除代码中的某些插座,请确保您没有尝试引用此插座的Nib文件。
答案 1 :(得分:0)
这可能对您的问题没有帮助,但如果您尝试创建通用二进制文件,那么使用#if
将无效。通用二进制文件应该包含iPhone和iPad的代码,并在运行时确定它运行的设备,如下所示:
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
此外,您的条件编译仅检查版本是否至少为3.2。当两个设备都发布iPhone OS 4.0时,您将获得iPhone版本中包含的仅限iPad功能的代码。
答案 2 :(得分:0)
要处理特定的类,请尝试在stackoverflow中找到(Jarad P's Solution),列表如下:
<小时/> ...“ Apple建议在iPad编程指南中使用通用应用程序,如果你想为多个操作系统版本构建不一致的API,你应该使用NSClassFromString,并从那里开始。这样,你只需要一个目标(您支持的最低操作系统)以及您的代码中包含等内容
Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
//Code for 3.2, e.g. [mplayerControllerClass alloc]
} else {
//Code for pre-3.2 OSes
}