1

全部。由于这个问题,我已经敲了几个小时的头。我有一个混合了 iPhone 和 iPad 项目的通用项目。我将这些代码库放在通用项目中,经过大量“ #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200”检查,让项目在 iPhone(OS 3.0 到 3.1.3)和 iPad 模拟器中运行。在对我加载的外部库的项目设置进行了更深入的研究之后,我将应用程序加载到了 iPhone(运行 OS 3.1.3)上。

但是,当我在 iPad 上运行该应用程序时,我会立即收到 SIGABRT 错误。我尝试在DebugRelease下使用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 中的 main 函数。

4

3 回答 3

2

看起来您在主 Nib 文件中有一些连接,这些连接指向正在加载的代码中不存在的插座。确保加载与平台匹配且与正在加载的代码同步的 Nib 文件。

如果您要删除代码中的某些插座,请#if __IPHONE_...确保您没有尝试引用此插座的 Nib 文件。

于 2010-04-27T12:44:56.290 回答
0

这可能对您的问题没有帮助,但是如果您尝试创建通用二进制文件,那么 using#if将不起作用。通用二进制文件应包含 iPhone 和 iPad 的代码,并在运行时确定它在哪个设备上运行,如下所示:

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )

此外,您的条件编译仅检查版本是否至少为 3.2。当为这两种设备发布 iPhone OS 4.0 时,您将获得 iPhone 版本中包含的仅限 iPad 功能的代码。

于 2010-04-27T15:56:45.763 回答
0

要处理特定的类,请尝试在 stackoverflow 中找到 (Jarad P 的解决方案) ,其中列出:


...” Apple 在 iPad 编程指南中对通用应用程序的建议,如果您想为 API 不一致的多个 OS 版本构建,您应该使用 NSClassFromString,然后从那里开始。这样,您只需有一个目标(你支持的最低操作系统)并且在你的代码中都有类似的东西

Class mplayerControllerClass = NSClassFromString(@"MPMoviePlayerViewController");
if(mplayerControllerClass != nil) {
   //Code for 3.2, e.g. [mplayerControllerClass alloc]
} else {
   //Code for pre-3.2 OSes
}
于 2010-06-30T19:55:27.663 回答