设备出错,但模拟器无法出错

时间:2009-05-19 04:49:26

标签: iphone objective-c cocoa-touch

我有这行代码(拆分是一个实例变量):

splits = [[NSMutableArray alloc] initWithObjects:[NSMutableArray array]];

这段代码显然是错误的(它应该是nil终止的),但它在模拟器中运行正常,即使它在设备上抛出EXC_BAD_ACCESS。我的问题是为什么模拟器不会抛出错误?

凯尔

3 个答案:

答案 0 :(得分:4)

实际结果取决于记忆内容。模拟器上的内存布局很可能在第一个参数(匿名数组)的地址后面包含零。这个零被解释为好像你要用nil关闭参数列表,一切正常。 (P.S.对于这种情况,有一个名为NS_REQUIRES_NIL_TERMINATION的有趣宏,虽然它在这里显然无济于事。)

答案 1 :(得分:1)

iPhone的内存比计算机少得多。在被initWithObjects函数使用之前,堆栈内存中的区域可能已设置为0x00(nil)。当参数被发送到initWithObjects函数并且堆栈被释放时,计算机上的内存空间更可能被预设为0x00,因为相同的内存空间使用频率较低。所以很可能是从已经设置为0的内存中的一个点读取nil。

如果您在计算机上填满内存,然后运行模拟器,模拟器可能会像iPhone一样崩溃。

答案 2 :(得分:0)

缓冲区溢出会导致未定义的行为。它们不能保证会导致访问冲突(甚至是明显的错误)。在现代机器上,如果您碰巧踩到“别人的”内存,它们将导致访问冲突,但如果您只是从自己的堆栈中读取垃圾,则可能不会。

基本上,你只需要小心,并且可以尝试像MudflapValgrind这样的工具来帮助你(这些特别的两个更适合于C / C ++,我不知道它们如何适用于Obj-C)。