iOS 设备和模拟器的构建实际上有何不同?

Posted

技术标签:

【中文标题】iOS 设备和模拟器的构建实际上有何不同?【英文标题】:How does building for iOS device and simulator actually differ? 【发布时间】:2012-04-18 08:29:33 【问题描述】:

ios模拟器既然是模拟器,那我为什么要专门为它构建呢?模拟器的意义不在于它在某种虚拟机/沙盒中运行真实代码吗?

那么,在构建设备/模拟器的工作方式以及最终构建的应用程序方面有何实际差异?

【问题讨论】:

【参考方案1】:

在 iOS 设备上本地运行的应用程序是 ARM 程序。 但是,在 iOS Simulator 中运行的应用程序是一个普通的 32 位(i386 架构)Mac OS X 程序。换句话说, 模拟器不会模拟 iOS 设备到硬件级别。 它提供了 iOS 环境的忠实副本,重新实现为 在 Mac 上本地运行。

【讨论】:

所以它实际上是为不同的架构编译的。在那种情况下,我正在使用的某些库将模拟器/设备二进制文件放在同一个位置并具有相同的名称,这很奇怪 - 所以每次我构建模拟器时,我都会丢失设备版本,反之亦然?带有预构建依赖库(.a 文件)的应用程序如何在模拟器和设备上运行? @john 您可以使用 xcode 附带的 lipo 工具来制作 fat(适用于设备和模拟器)二进制文件。 # 新建一个输出文件夹 mkdir -p $PROJECT_DIR/build/$BUILD_STYLE-iphoneos/DTUtilities # 将各种平台的lib文件合并为一个 lipo -create "$PROJECT_DIR/ build/$BUILD_STYLE-iphoneos/libDTUtilities.a" "$PROJECT_DIR/build/$BUILD_STYLE-iphonesimulator/libDTUtilities.a" -output "$PROJECT_DIR/build/$BUILD_STYLE-iphoneos/DTUtilities /libDTUtilities-$BUILD_STYLE.a"【参考方案2】:

模拟器版本使用 i386 指令集,因为这是您的 mac 使用的。

当您为 iOS 设备构建时,您正在构建 armv6 或 armv7 指令集。

模拟器的目的是让您可以在您的 Mac 上进行一些快速测试,而无需使用设备。

要了解有关指令集的更多信息:http://en.wikipedia.org/wiki/Instruction_set

【讨论】:

模拟器从不发出内存警告。但是不同的设备有不同的内存,所以要创建一个好的应用程序,我们必须在模拟器和设备上测试它。查看同样的问题link【参考方案3】:

模拟器和设备应该运行相同的代码,但应该注意的问题很少。

    模拟器无法运行设备可以运行的所有功能,例如模拟器不与相机交互,不存在 GPS 数据(但您可以从选项中设置固定位置),并且几乎没有其他类似的东西。

    模拟器可用于检查您的代码和功能,比在开发时将代码转储到设备上要快得多,但模拟器正在使用您计算机的内存和 CPU,这意味着它不能反映在设备上的性能真实设备、速度和内存方面。

好的做法是主要在模拟器上进行测试和开发,当您的代码稳定并按计划工作时 - 是时候在设备本身上测试它的性能和其他特定于设备的问题了。

我可以详细说明该主题,但这是对您问题的快速回答。

【讨论】:

以上是关于iOS 设备和模拟器的构建实际上有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

文本字段的动画不隐藏在键盘下方,在 IOS 7 中的模拟器和实际设备中的行为不同

App在iOS设备和iOS模拟器上的行为有所不同

iOS9:在模拟器和设备上使用动态框架

如何在我的 iOS 项目中为模拟器和设备构建和集成 pjsip 2.5.5?

Siphon 为 iOS 模拟器构建,但在设备构建时出现链接器错误

无法将 ios 应用程序构建到设备中,因为“嵌入式框架 'SharedCode.framework' 是为 iOS 模拟器构建的。”