【问题标题】:Why are device and simulator builds different?为什么设备和模拟器构建不同?
【发布时间】:2009-11-23 16:28:38
【问题描述】:

我引用了两个静态库。我在调试模拟器模式下构建它们,并且在我的应用程序中运行良好。然后我创建 debug-iphone 构建并将我的应用程序推送到设备。它因此错误而中断:

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

然后显示SIGABRT错误。

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

-- 编辑--

终于想出了一个解决方法,至少可以在设备上运行,但现在不能在模拟器上运行。引发异常的方法是我用于字体的类。例如,它是出现问题的库 staticLibA 的一部分。我在目标应用程序和问题类的 .m 文件中包含了 staticLibA 作为参考。我已经引用了它的头文件,它是 NSString 中的一个类别。这就是为什么在我包含 .m 文件之前它不起作用的原因吗?

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

【问题讨论】:

    标签: iphone cocoa-touch xcode static-libraries


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我没有使用 cocos2d。这两个库是我创建的。我在问题库中注意到它的调试设备版本是为 i386 设置的。我将其更改为与工作库相同的 - arm6/7。那没有帮助。然后我注意到优化级别设置为“最快,最小”,而工作库设置为“无”。我会试一试,然后发回结果。
    • 优化更改没有做任何事情。仍然抛出异常。
    【解决方案2】:

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

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

    您不能使用已针对另一个编译的库。各自的汇编代码不兼容。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 无论您是在模拟器还是设备上,该问题都应该出现。我在启动时收到错误。
      猜你喜欢
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多