2009-11-23 58 views
2

我引用了两个静态库。我在调试模拟器模式下构建它们,并且与我的应用程序一起运行良好。然后我创建debug-iphone构建并将我的应用程序推送到设备。它打破了这个错误:为什么设备和模拟器的构建有所不同?

终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因: '*** - [NSCFString sizeWithCGFont:的pointsize:constrainedToSize:]:无法识别的选择发送到实例0x24320'

然后SIGABRT错误显示。

为什么在模拟器上工作正常,只能在设备上显示?

- 编辑 -

终于想出了一个解决办法,至少在设备上运行,但现在不是模拟器。抛出异常的方法是我用于字体的类。它是staticLibA的一部分,例如,这是有问题的库。我在目标应用程序中包含了staticLibA作为参考,还包括了问题类的.m文件。我已经引用了它的头文件,这是NSString中的一个类别。这就是为什么直到我包含.m文件才有效吗?

如果我尝试在模拟器中运行它,上面的类的构建输出文件夹中出现重复的对象错误。

回答

2

我不能告诉你为什么你的问题只是在设备上显示自己 - 也许你需要清理这两个版本,并尝试重新编译它们?

在任何情况下,显示的异常消息都是完全有效的。没有(公共)方法名为-[NSString sizeWithCGFont:pointSize:constrainedToSize:]。你是否试图在NSString的任何地方调用sizeWithFont:方法之一?

编辑:看起来像sizeWithCGFont:pointSize:constrainedToSize:来自cocos-2d,我猜测会是你的静态库之一。模拟器和设备构建之间的主要区别在于构建架构 - 模拟器的架构是您自己的机器(i386)的架构,而设备构建是针对armv6或armv7。你确定你的静态库是为适合的架构而构建的吗?

+0

谢谢。我没有使用cocos2d。这两个库是我创建的。我注意到问题库中它的调试设备版本是为i386设置的。我将其改为与工作库相同 - arm6/7。这没有帮助。然后我注意到优化级别设置为“最快,最小”,而工作库设置为“无”。我会试一试并回传结果。 – 4thSpace 2009-11-23 16:55:49

+0

优化更改没有做任何事情。仍抛出异常。 – 4thSpace 2009-11-23 22:56:25

0

由于您的计算机位于x86(或x86_64)体系结构上,所以模拟器构建是针对英特尔平台编译的。

该设备构建编译到arm6(或arm7)体系结构。

您不能使用一个已编译为另一个的库。每个汇编代码都不兼容。

0

我有这个问题,当我不正确地释放对象时出现。所以我会有一个指向未分配对象的指针。所以当我在对象上调用函数时,会说我正在调用NSCFString对象上的函数。可能是因为内存被重新用于NSString对象。我通过寻找我的额外版本并将其删除来修复它。

+0

无论您是在模拟器还是设备上,都应该显示该问题。我在启动时遇到错误。 – 4thSpace 2009-11-24 04:01:10

相关问题