使用带有ARC的NSMutableArray进行错误访问

时间:2014-09-10 21:09:07

标签: ios objective-c arrays cocos2d-iphone

目前我正在使用box2d使用cocos2d v3.1创建游戏,所以我必须使用.mm扩展名来源我的源文件以表明我正在使用c ++。 游戏包含一个由地形关键点组成的“无尽地形”。我创建了一个保存名为TerrainElement的关键点的类。 在游戏开始时,我创建了一个名为_elements数组的NSMutableArray,并用随机TerrainElements填充它。

在游戏循环中,我检查迭代元素,并绘制所有现在可见的元素。然而,应用程序在相当随机的时间后崩溃。

标题

@interface TerrainBase : CCNode{
     NSMutableArray * _elements;
}

游戏循环的一部分:

while (((TerrainElement*)[_elements objectAtIndex:toKeyPoint]).startPoint.x < _currentX+winSize.width*9/8) {

    //Crashes sometimes here EXC_BAD_ACCESS, _elements array is NULL
     TerrainElement *element = (TerrainElement*)[_elements objectAtIndex:toKeyPoint];


    [element drawElement];
    toKeyPoint++;

}

我无法弄清楚为什么NSMutableArray为NULL。我只是迭代每个循环中的元素,并且基本上不要触摸它们。我用_elements数组(非原子,强)制作了一个属性,这也没有帮助。 我决定使用普通数组而不是NSMutableArray。我没有更改代码,除了数组的索引:

@interface TerrainBase : CCNode{
    TerrainElement *_elements[4000];
}

gameLoop:

while ( _elements[toKeyPoint].startPoint.x< _currentX+winSize.width*9/8) {

            [_elements[toKeyPoint] drawElement];

    toKeyPoint++;

}

这次一切正常,数组永远不会为NULL。这对我来说是个谜,为什么第二个解决方案有效,但第一个解决方案仍在崩溃。我更喜欢使用NSMutableArray,因为它给了我更多的灵活性。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您可以向nilNULL)发送消息,因此这不是自行崩溃的原因(在这种情况下,您只需返回nil。)< / p>

我不确定您是否提供了足够的信息来确定实际原因。请发布堆栈跟踪和任何异常。你发布的代码是否包含该循环中发生的所有事情?

你的循环条件在某种程度上对我来说是错误的逻辑:

  1. 除非您的数组按startPoint.x排序,否则只要遇到第一个元素&gt; = _currentX+winSize.width*9/8
  2. ,就会停止绘制地形
  3. 如上所述,您nil发送消息,您将获得nil(或NULL0或其他任何内容想要调用它)返回返回的值。这意味着只要_elementsnil,您就会有一个无限循环(因为[_elements objectAtIndex:toKeyPoint]).startPoint.x将始终评估为0,而且总是<_currentX+winSize.width*9/8

    我需要更多信息来帮助您。