我有这行代码(拆分是一个实例变量):
splits = [[NSMutableArray alloc] initWithObjects:[NSMutableArray array]];
这段代码显然是错误的(它应该是nil终止的),但它在模拟器中运行正常,即使它在设备上抛出EXC_BAD_ACCESS
。我的问题是为什么模拟器不会抛出错误?
凯尔
答案 0 :(得分:4)
实际结果取决于记忆内容。模拟器上的内存布局很可能在第一个参数(匿名数组)的地址后面包含零。这个零被解释为好像你要用nil
关闭参数列表,一切正常。 (P.S.对于这种情况,有一个名为NS_REQUIRES_NIL_TERMINATION
的有趣宏,虽然它在这里显然无济于事。)
答案 1 :(得分:1)
iPhone的内存比计算机少得多。在被initWithObjects函数使用之前,堆栈内存中的区域可能已设置为0x00(nil)。当参数被发送到initWithObjects函数并且堆栈被释放时,计算机上的内存空间更可能被预设为0x00,因为相同的内存空间使用频率较低。所以很可能是从已经设置为0的内存中的一个点读取nil。
如果您在计算机上填满内存,然后运行模拟器,模拟器可能会像iPhone一样崩溃。
答案 2 :(得分:0)