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 上的主要内容,如果未能解决你的问题,请参考以下文章