为什么设备和模拟器构建不同?

时间:2009-11-23 16:28:38

标签: iphone cocoa-touch xcode static-libraries

我正在引用两个静态库。我在调试模拟器模式下构建它们,所有这些都适用于我的应用程序。然后我创建debug-iphone版本并将我的应用程序推送到设备。它打破了这个错误:

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

然后SIGABRT错误显示。

为什么它在模拟器上工作正常并且只在设备上显示?

- 编辑 -

最后想出了一个解决方案,至少在设备上运行但现在不是模拟器。抛出异常的方法是我用于字体的类。它是staticLibA的一部分,例如,它是有问题的库。我将staticLibA作为目标应用程序中的引用以及问题类的.m文件包含在内。我已经有了对其头文件的引用,这是NSString中的一个类别。这就是为什么它在我包含.m文件之前不起作用?

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

3 个答案:

答案 0 :(得分:2)

我无法告诉你为什么你的问题目前只出现在设备上 - 也许你需要清理这两个版本并尝试重新编译它们?

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

编辑:看起来sizeWithCGFont:pointSize:constrainedToSize:来自cocos-2d,我猜这将是你的静态库之一。模拟器和设备构建之间的主要显着差异是构建体系结构 - 模拟器的体系结构是您自己的机器(i386)的体系结构,而设备构建适用于armv6或armv7。您确定您的静态库是为正确的体系结构构建的吗?

答案 1 :(得分:0)

由于您的计算机采用x86(或x86_64)架构,因此可以为Intel平台编译模拟器版本。

设备构建编译为arm6(或arm7)架构。

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

答案 2 :(得分:0)

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

相关问题