【发布时间】: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