【问题标题】:SIGABRT error when running on iPad在 iPad 上运行时出现 SIGABRT 错误
【发布时间】:2010-04-27 05:11:52
【问题描述】:

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

但是,当我在 iPad 上运行应用程序时,我立即收到 SIGABRT 错误。我尝试在 Debug 下,在 Release 下运行它,同时使用 armv6 和 armv7 的 Active Architecture。我已经检查并再次检查了该应用程序是否设置了正确的 nib 文件(但同样,该应用程序在模拟器中运行良好)。我浏览了我正在使用的外部库,并将它们设置为具有相同的 base SDK (3.2)、相同的 architectures(优化 (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 函数。

【问题讨论】:

  • 在调试器中运行它,当 SIGABRT 发生时,在控制台中输入“bt”。它至少应该给你一个开始的地方。很可能有一些 assert() 在某处徘徊,无论出于何种原因在设备上都失败了。
  • 嗨,杰森,感谢您的回复。我发现它并没有脱离 main.m 中的主要功能。我将更新原始帖子以显示我所看到的。
  • FWIW,您的应用永远不会“脱离主功能”。在您的应用程序的整个生命周期中,这将处于堆栈的底部。
  • 我发现由于我收到此错误,即使在我创建新项目并编译它而不写单行时也会出现。所以可能这不是代码的问题,而是 XCode 的问题。

标签: iphone ipad universal sigabrt


【解决方案1】:

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

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

【讨论】:

  • 啊,谢谢你,克劳斯。你让我找到了正确的道路。事实证明,我的“#if __IPHONE_...”检查没有像我预期的那样工作。我想将它们用于特定于 iPad 的课程,在 iPhone 上运行时被忽略。对于它的价值,这就是我所拥有的:“#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200”,这就是你需要的:“#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200”啊,真是个白痴。呵呵,至少我明白了。 :)
【解决方案2】:

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

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )

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

【讨论】:

  • 是的,我想知道这一点。我需要弄清楚如何处理诸如声明一个类符合 UIPopoverControllerDelegate 之类的事情。我希望 Apple 允许您将单独的 iPhone 和 iPad 二进制文件组合在一起,并将它们称为“通用”。
【解决方案3】:

要处理特定的类,请尝试在 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多