GHUnit 在模拟器中运行,但不在 iPhone 上

Posted

技术标签:

【中文标题】GHUnit 在模拟器中运行,但不在 iPhone 上【英文标题】:GHUnit runs in Simulator but not on iPhone 【发布时间】:2011-07-18 20:12:55 【问题描述】:

所以我今天一直在玩 GHUnit,并且有一些很好的测试在 XCode4 的模拟器中运行得很好。当我在 iPhone 上运行它们时,出现以下错误:

'Unable to instantiate the UIApplication delegate instance.
No class named GHUnitIPhoneAppDelegate is loaded.'

在你问之前,是的,我已经设置了链接器选项 -ObjC-all_load,正如我所说,它在模拟器中运行良好,那为什么不是 iPhone 本身呢?

困惑!

【问题讨论】:

【参考方案1】:

我不确定这个问题的真正原因,但我确实找到了解决方法。

由于某种原因,我仍然不太确定是否理解替换:

int retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIPhoneAppDelegate");

int retVal = UIApplicationMain(argc, argv, nil, @"GHUnitiosAppDelegate");

在主文件中将解决问题。

GHUnitIPhoneAppDelegate 类继承自 GHUnitIOSAppDelegate 但它不包含在最终的二进制文件中(我运行了nm -a GHUnitIPhoneAppDelegate|grep IPhoneApp,没有结果)。

一个疯狂的猜测是,由于该类仅继承自它(没有其他方法或属性)并且因为在框架中没有实例化该类(仅通过字符串提及),编译器为了节省空间,将其从iOS 模式下的二进制信息。

希望这会有所帮助,至少对我有用。

【讨论】:

昨晚发布了一个新版本的 GHUnit,修复了这个问题 - 但感谢您的帮助! 他的解决办法是显然地做exact same thing ;) 优秀。我什至没有看他做了什么。【参考方案2】:

澄清一下,GHUnitIOS-0.4.32 于 2011 年 8 月 11 日上传到 https://github.com/gabriel/gh-unit/downloads throws

NSInternalInconsistencyException', reason: 'Unable to instantiate the UIApplication delegate instance. No class named GHUnitIPhoneAppDelegate is loaded.'

如果int main(int argc, char *argv[]) 包含:

int retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIPhoneAppDelegate");

适用于:

int retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIOSAppDelegate");

由于 armv6 和 armv7 库中缺少 GHUnitIOSAppDelegate。注意 GHUnitIPhoneAppDelegate 在模拟器库中...

GHUnitIOS.framework$ nm -a -arch i386 GHUnitIOS | grep GHUnitIPhoneAppDelegate
nm: no name list
GHUnitIOS(GHUnitIPhoneAppDelegate.o):
00000084 S _OBJC_CLASS_$_GHUnitIPhoneAppDelegate
00000070 S _OBJC_METACLASS_$_GHUnitIPhoneAppDelegate
00000048 s l_OBJC_CLASS_RO_$_GHUnitIPhoneAppDelegate
00000020 s l_OBJC_METACLASS_RO_$_GHUnitIPhoneAppDelegate
GHUnitIOS.framework$

但不在这两个设备库中的任何一个中......

GHUnitIOS.framework$ nm -a -arch armv6 GHUnitIOS | grep GHUnitIPhoneAppDelegate
nm: no name list
GHUnitIOS.framework$

GHUnitIOS.framework$ nm -a -arch armv7 GHUnitIOS | grep GHUnitIPhoneAppDelegate
nm: no name list
GHUnitIOS.framework$

【讨论】:

是的,正如我在回复中提到的,这可能是编译器优化,因为GHUnitIPhoneAppDelegate 从未实例化或派生自。我猜当最终架构是 armv6/7 时编译器会进行更多优化,但我很想知道它的真相。 是的,我会发表评论,但我还没有这样做的权力。 ;) 只是想澄清以前的 cmets,这使得 GHUnitIOS 0.4.32 看起来可以与 GHUnitIPhoneAppDelegate 一起使用,但它不能。【参考方案3】:

我会将@apouche 的答案保留为已接受的答案,因为这回答了我的问题并帮助了我。

但是,来自 GHUnit 的开发者 gabriel 的消息 - 说这是一个错误,他已经发布了一个新版本 (0.4.32) 来解决这个问题。

【讨论】:

以上是关于GHUnit 在模拟器中运行,但不在 iPhone 上的主要内容,如果未能解决你的问题,请参考以下文章

GHUnit 跳转到代码中的错误

HTMLKit 在模拟器上运行但不在设备上

如何在命令行 GHUnit 中使用 UIApplicationDelegate?

WebView 中的背景图像显示在模拟器中,但不在设备上

WebView 在模拟器中加载但不在设备中

CoreLocation 应用程序在模拟器中工作但不在设备上