iPhone设备与iPhone模拟器

39

我听说过有些应用在模拟器上无法正常工作,但在实际的iPhone设备上却可以正常工作。有没有人经历过在模拟器上完美运行但在实际iPhone设备上无法运行的应用呢?


我希望这个URL对您有所帮助:区分iPhone、iPad和模拟器的不同 #if TARGET_IPHONE_SIMULATOR // 仅适用于模拟器的代码 #elif TARGET_OS_IPHONE // 仅适用于iPhone的代码 #elif TARGET_OS_IPAD // 仅适用于iPad的代码 #else // 未知目标 #endif http://cduu.wordpress.com/2010/10/20/differentiate-between-iphone-and-simulator/ - user1564754
25个回答

30

在 iPhone 上,文件名区分大小写,但在模拟器上不区分。

例如,如果您尝试使用UIImage *iconImage = [UIImage imageNamed:"MyIcon.png"]加载图像,但实际资源名称为"myicon.png",那么它将在模拟器上工作,但在设备上无法正常工作。


你是否已经向苹果提交了这个问题的错误报告? - Steven Noyes
5
我认为他们不会认为这是一个漏洞。iPhone的文件系统并不意味着与Mac相同,而Mac的文件系统由于历史原因是不区分大小写的。 - Kristopher Johnson
所以我们需要(并且需要)在iPhone上有10个文件名...全部都叫相同的名字...除了大小写不同?这样做的目的是什么?只是为了故意不匹配数百万个Mac文件系统吗?这样做的好处是什么? - Susanna
4
大多数基于UNIX的系统都具有区分大小写的文件系统。Mac OS X在这方面比较“奇怪”,之所以这样做是为了保持与OSX之前的Mac系统的兼容性。iOS真的没有理由去匹配它。 - Kristopher Johnson
1
在格式化之前,您实际上可以在磁盘工具中指定新的Mac文件系统的大小写敏感性。 - Gyuri
13
模拟器中存在明显的错误。模拟器应该模拟设备上发生的情况。“哦,Mac文件系统不区分大小写”的解释只是借口。苹果很容易就可以解决这个问题。 - Todd Lehman

14

如果您的应用程序具有图形密集型,比如游戏,那么模拟器的性能完全不像硬件。您的应用程序在模拟器上运行可能会非常流畅,但是在硬件上渲染时可能会变得缓慢,除非您知道自己在做什么。您的应用程序在模拟器和硬件之间可能会轻松从60fps降至3fps。


3
我看到了相反的情况:我的应用在模拟器上运行缓慢,但在设备上却很流畅。我认为这是由于MacBook的图形能力较差所致;如果使用更好的Mac可能会更好一些。 - Kristopher Johnson
2
克里斯托弗,那听起来不对。根据我的基准测试,我的第一代(白色)Core 2 Duo MacBook在OpenGL中每秒可以推动9倍三角形比iPhone更快。也许你有一个线程锁定问题,导致渲染卡住了。 - Brad Larson
1
不使用线程,也不使用OpenGL。但重点是两个平台之间的性能可能会有很大的差异。 - Kristopher Johnson
6
我曾经见过很多情况,在iPad模拟器中动画不可能完全顺畅,但在设备上却绝对没问题。核心动画的表现并不总是在模拟器中更好,你应该始终在实际设备上进行测试。 - Nick Forge
2
使用Cocos2d,在模拟器上平均可达30fps。当我在真正的iPad上运行相同的应用程序时,我的平均fps为60。 - Jay Haase
当将模拟器作为iPad运行时,我猜它必须从计算机中减去1Ghz以创建一个相对类似的体验。这对于2GHz机器来说是很大的打击!我的经验也是,从模拟器切换到设备时,速度通常会提高。 - RickiG

11

函数/构造函数参数的求值顺序是不同的:

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

7
这个顺序真的没有明确定义,取决于实现。因此,如果您使用两个不同版本的编译器在相同的平台上进行操作,可能会看到不同的行为。 - Kristopher Johnson

10

三角函数可能返回不同的结果:

float a = cosf( 0.108271248639 );   
printf("%.12f", a);

//simulator: 0.994144439697
//device:    0.994144380093

4

有一些代码在模拟器上无法工作(例如使用iPhone Keychain),但对于几乎所有应用程序来说,模拟器与iPhone的工作方式完全相同。

尽管如此,在真实设备上进行测试是不可替代的。


2
我认为内存管理是一个很大的例外。然而,你总是在硬件上测试的经验法则是正确的。 - Rog

4
我知道设备和模拟器在OpenGL ES实现上有一些区别。据我所了解,这主要是因为iPhone上的图形芯片(PowerVR MBX)具有与其他Mac机器迥然不同的功能。许多硬件限制在模拟器中并没有被强制执行,因此完全有可能在模拟器中运行某些东西,但在设备上会完全崩溃。
此外,iPhone硬件支持的一些OpenGL ES扩展在模拟器中并不支持。我认为主要的一个扩展是PowerVR纹理压缩(PVRTC)。
另一个问题领域可以是内存占用。根据经验,我没有看到模拟器自动强制执行设备的内存限制。因此,可能会出现在模拟器中运行良好、愉快地消耗大量RAM并永远不去释放它们的情况,但当在设备上运行时,这样的行为只会短暂延续,就会迅速被终止。

1
在图形芯片中需要注意的另一个区别是,iPhone仅支持无符号短整型作为索引的数据类型,这意味着您只能在一个顶点数组中寻址65,536个顶点。而Mac支持更大的数据类型。这给我带来了问题。 - Brad Larson

3

请注意,在构建模拟器时,您将编译针对 OS X 框架(如果适用),因此您可能使用的方法和类在 iPhone 版本的框架上不可用。

我能想到的一个例子是 NSPredicate。我能够在模拟器中编译和运行使用 NSPredicate 的应用程序,但它无法为设备编译,因为该类不可用。


NSPredicate自iOS 3.0版本以来就可用。 - fatuhoku

3

我遇到了一个问题,无法在设备上运行相对简单的1/30秒计时器来更新游戏。在模拟器中可以正常运行,但会冻结设备上的输入。


你能找到解决方案吗? - user21293
2
使用CADisplayLink代替NSTimer。如果您正在使用NSTimer进行快于1或2秒的常量更新,则应该改用CADisplayLink(自iOS 3.1添加)。 - John Haney

3

手指触控区域要比鼠标光标的1个像素端点要大。为了进行适当的甚至是最基本的可用性测试,您应该将您的应用部署到设备上。


2

有一件很重要的事情花了我很长时间才发现,那就是模拟器不支持设备令牌,所以任何涉及到这些的代码都不能在模拟器上运行。

我遇到一个问题,应用在模拟器上能够正常工作,但在设备上运行时会崩溃,因为设备令牌代码中存在一个错误。我花了很长时间也没找出来!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接