[英]iPhone device vs. iPhone simulator
我听说应用程序在模拟器上无法正常工作,但在实际的iPhone设备上正常工作。 有没有人经历过在模拟器中完美运行但在实际iPhone设备上没有运行的应用程序?
文件名在iPhone上区分大小写,但在模拟器中不区分大小写。
因此,例如,如果您尝试使用UIImage *iconImage = [UIImage imageNamed:"MyIcon.png"]
加载图像,但您的资源实际上名为“myicon.png”,那么它将在模拟器上运行,但不会在设备上。
如果您的应用程序是图形密集型的,比如说游戏,那么模拟器的性能并不像硬件那样。 您的应用程序可能会很平滑并且在模拟器上运行良好,但在硬件上它可能会爬行,除非您知道自己在做什么。 您可以轻松地在模拟器和硬件之间从60fps到3fps。
评估函数/构造函数参数的顺序是不同的:
int i = 0;
int f() { return ++i; }
int a, b;
int test(int p1, int p2) {
a = p1;
b = p2;
}
test( f(), f() );
//simulator: a = 2, b = 1
//device: a = 1, b = 2
三角函数可能会返回不同的结果:
float a = cosf( 0.108271248639 );
printf("%.12f", a);
//simulator: 0.994144439697
//device: 0.994144380093
我知道设备和模拟器之间的OpenGL ES实现存在一些差异。 据我所知,这主要是因为iPhone(PowerVR MBX)上的图形芯片具有与其他mac机器截然不同的功能。 许多硬件限制没有在模拟器中强制执行,因此完全可以在模拟器中运行一些在设备上完全崩溃的东西。
iPhone硬件也支持一些OpenGL ES扩展,模拟器不支持这些扩展。 我相信主要的是PowerVR纹理压缩(PVRTC)。
另一个问题区域可能是内存占用。 有趣的是,我还没有看到模拟器自动强制执行设备的内存限制。 因此,有可能在模拟器中运行一些正常的东西,愉快地消耗大量的RAM,并且从不打扰任何它只是在设备上运行时短暂持续这种行为后迅速终止。
指尖大于鼠标光标的1像素端点。 要进行适当的,甚至是最小的可用性测试,您应该将应用程序部署到设备上。
有些代码在模拟器上不起作用(例如,使用iPhone Keychain),但对于几乎所有应用程序,模拟器的工作方式与iPhone完全相同。
也就是说,在真实设备上进行测试绝对没有替代品。
我在运行一个相对简单的1/30秒计时器时遇到了问题,无法为游戏做更新。 它在模拟器中运行良好,并冻结设备上的输入。
另请注意,在为模拟器构建时,您将针对OS X框架(如果适用)进行编译,以便您可以使用框架的iPhone版本上不可用的方法和类。
我能想到的一个例子就是NSPredicate。 我能够在模拟器中使用NSPredicate编译和运行应用程序,但由于该类不可用,因此无法为设备编译。
如果启用GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS,您的应用程序将在模拟器中的所有位置崩溃,但在iPhone上工作。
iPhone模拟器中的Quartz图形调用比同一台计算机上的Java2D调用更快 - 邪恶快速。
我在内存饥渴的应用程序中遇到了一些问题,模拟器可以正常工作(因为它会假设iPhone / iPod Touch的内存全部都是你玩的),而设备会崩溃(因为其他应用程序泄露了和苹果背景服务占用了一些内存)我没有实现适当的内存管理或对didReceiveMemoryWarning
选择器的响应。
花了一段时间才发现的一件大事是模拟器不支持设备令牌,因此任何涉及这些令牌的代码都不会在模拟器上运行。
我有一个错误,应用程序可以在模拟器上正常工作,但是当我在设备上运行它时会崩溃,因为设备令牌代码中存在错误。 我想不出来的时间最长!
有许多琐碎的例子。 例如,您可以在模拟器上分配比在真实手机上更多的内存。 如果您没有视网膜Mac,则无法在模拟器上接收推送通知,显示点距不同。
在更基础的层面上,模拟器就是这样,它使用Mac OS X模拟iPhone OS X.这可以通过以下事实得到证明:模拟器上的文件系统可能不区分大小写,但在手机上它将是。 更巧妙的是,它不会模拟硬件,因此像位置这样的东西将不会起作用,3D会有很大的不同 - 特别是如果你使用的是Metal。
您应该始终在真实硬件上进行测试。
电影文件(m4v类型),因为我的经验是第一次正常播放
但第二次它闪烁模拟器的屏幕......
而在iPhone设备中,它的工作原理...
如果应用程序的状态栏被隐藏,在模拟器的情况下它仍然消耗触摸事件。 但在设备中它表现得很完美。
在没有考虑两者之间的性能差异的情况下,曾经存在模拟器没有正确执行的一些事情 - 即在某些情况下它会混乱音频(请参阅此问题 )。 但是,自2.2 SDK以来,这个问题已得到解决,声音似乎在模拟器中很好。 这并不是说潜伏在那里的其他不兼容性! (我没遇到过)
我有一些声音效果在模拟器中播放得很好,但在设备上没有。 我不得不将格式更改为设备可以处理的内容。
是的 - 前几天发生在我身上。 我是iphone的新用户,因此删除了MainWindow.xib,认为它未被使用。 该应用程序在模拟器上完美运行 - 但在手机上安装时崩溃了。
我们遇到的另一个问题是我们的three20依赖项,它们被设置为ios 3.2而不是4.1。 在模拟器中完美地工作,但在设备上被轰炸(因为文件被编译为错误的拱门)。
在模拟器中无法访问iphone视频库,但代码在实际设备上工作正常
关于声音,我遇到了同样的问题。 问题是模拟器支持的声音编码是与设备不同的一组声音。 我希望有所帮助。
从模拟器移动到设备时,我遇到了很多库和框架的问题。 尤其是它们似乎有不同的架构!
我已经看到对象的定位,比如工具栏在模拟器上的不同,而不是在手机上。 很烦人。
是啊....
为2.x编译的应用程序将在3.0设备上正常工作,但它将在3.0Simulator上崩溃
注意:1。如果您编译为3.0,应用程序将在3.0模拟器上正常工作... 2. a)编译2.x并在模拟器中启动应用程序。 b)现在将iPhone模拟器硬件更改为“3.0”。 c)然后启动我们之前在步骤a)中安装的应用程序。 崩溃!!!!!!!!
当试图访问UIDevice.currentDevice()时,它返回iOS模拟器而不是您正在测试的实际设备。 这很糟糕,因为你无法在模拟器上做某些事情。
模拟器中的资源加载比设备中的加载速度快很多。 例如,加载和显示一系列全屏UIImages
(如基本视频)在模拟器中看起来非常流畅,并且在设备上看起来不稳定。
实际上,请记住不同设备之间存在巨大的速度差异。 最初的iPhone和iPhone 3G比iPod touch第二代慢,后者也比iPhone 3GS慢得多,依此类推。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.