Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标c中这两个for循环之间的差异_Ios_Objective C_For Loop - Fatal编程技术网

Ios 目标c中这两个for循环之间的差异

Ios 目标c中这两个for循环之间的差异,ios,objective-c,for-loop,Ios,Objective C,For Loop,好的,我正在构建一个iOS游戏,我觉得我对objective-c有很好的理解,但有一件事让我痛苦万分,那就是我在使用以下for循环时遇到的参考错误 for (MyObject *object in nsMutableArrayOfObjects) { // do things with object } vs for(int i=0;i

好的,我正在构建一个iOS游戏,我觉得我对objective-c有很好的理解,但有一件事让我痛苦万分,那就是我在使用以下for循环时遇到的参考错误

for (MyObject *object in nsMutableArrayOfObjects) {
    // do things with object
}
vs

for(int i=0;i

我让其中一些(第一个循环示例)按顺序运行,并不断得到
EXC\u BAD\u ACCESS
错误。我也有一些循环嵌套,我会把在其他。我只是很想知道关键的区别是什么。我假设差异与它们引用数组中对象的方式有关。

您发布的第一个示例使用快速枚举-枚举集合的首选方法。
苹果公司在报告中提供了详细信息


我不确定是什么原因导致了您的
EXC\u BAD\u访问
(听起来更像是内存管理问题)。但在使用快速枚举时要记住的一点是,不能对正在枚举的集合进行变异

这可能与内存分配有关,因为nsMutableArrayOfObjects没有为每个时钟周期在循环中创建新指针,而您的第一个循环在每个周期中分配新指针


这两个循环都是正确的,我们无法回答,因为我们没有看到更多的代码。。。
无论如何,使用EXC\u BAD\u访问,您可能正在访问解除分配的对象。

是的,在使用快速枚举时对数组进行变异。这就是问题所在。你能更详细地解释一下区别吗?快速枚举是只读对象吗?关键区别在于快速枚举是一种使用结构作为缓冲区的方法,一次读取多个对象。在内部,它使用objectAtIndex:和突变计数器来检测变化。更改引发NSGenericeException,但您可能删除了某些内容并获得了EXC\u BAD\u访问权限。有关详细信息,请参阅这些Big Nerd Ranch的帖子:,。请注意,使用其他类型的循环进行枚举时,变异仍然是不安全的,您只会得到随机的不可能诊断的崩溃,而不是带有好消息的好崩溃。你的错误没有被修复!看来@weichsel已经接近一个很好的答案了。不确定为什么没有人指出第二个循环甚至不应该编译,将int与NSMutableArray*进行比较。要获得关于异常的最终答案,请发布实际异常(如果是在枚举时更改数组的情况,则会显示该异常),并在循环中发布代码。此外,在第二个循环中,
nsMutableArrayOfObjects
应该是
[nsMutableArrayOfObjects count]
。您可能希望使用新的块语法进行枚举,
for (int i = 0; i< nsMutableArrayOfObjects.count; i++) {
    // do things with nsMutableArrayOfObjects[i];
}