【问题标题】:Bad Access using NSMutableArray with ARC使用带有 ARC 的 NSMutableArray 的错误访问
【发布时间】:2014-09-10 21:09:06
【问题描述】:

目前我正在使用 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 Array(nonatomic,strong) 中创建了一个属性,这也没有帮助。 我决定使用普通数组而不是 NSMutableArray。我根本没有更改代码,除了数组的索引:

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

游戏循环:

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

            [_elements[toKeyPoint] drawElement];

    toKeyPoint++;

}

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

【问题讨论】:

  • 显示完整异常消息和异常堆栈跟踪。
  • 因没有异常消息和堆栈跟踪而被否决。
  • 在“随机”时间后崩溃表明存在更大的问题,例如内存泄漏到爆炸点。
  • 你在哪里以及如何分配_elements?即至少应该有:_elements = [NSMutableArray array]; .. 另请注意,在 while 循环中,您要访问同一个元素两次,您可能希望通过在循环之前和循环中分配当前元素来加快速度,这样每个枚举只有一个数组访问。

标签: ios objective-c arrays cocos2d-iphone


【解决方案1】:

您可以向nil (NULL) 发送消息,因此这不是自行崩溃的原因(在这种情况下您只会收到nil)。

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

在我看来,您的循环条件在几个方面看起来像是有缺陷的逻辑:

  1. 除非您的数组按startPoint.x 排序,否则您将在遇到第一个元素时立即停止绘制地形 >= _currentX+winSize.width*9/8
  2. 正如我上面所说,您可以nil 发送消息,您将收到nil(或NULL0 或任何您想称呼的名称)返回的值。这意味着只要_elementsnil,您就会有一个无限循环(因为[_elements objectAtIndex:toKeyPoint]).startPoint.x 将始终评估为0,这可能始终是_currentX+winSize.width*9/8。

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

【讨论】:

  • 抱歉打错了。喝了 3 杯啤酒后我不应该发帖:-/ 当然,我在调用 [element drawElement] 的方法不起作用。并且应用程序在获取所需索引处的 NSMutableArray 元素时崩溃。
  • @Rambazamba -- 显示完整的异常消息和堆栈跟踪。
  • @Rambazamba 更新了答案,但仍需要更多信息。
  • 抱歉,重播晚了 - 这个问题确实是由内存泄漏引起的。感谢您为我指出正确的方向@Brad Allred。下周假期回来时,我将发布解决方案。谢谢@所有的帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多