我在cocos2d / xcode
中使用NSMutableArray时出现了一个非常奇怪的错误在我的代码中,我有一个包含对象A
的NSMutableArrayNSMutableArray *peasantArray;
和另一个NSMutableArray包含对象B
NSMutableArray *treeArray;
在预定更新功能中,我调用了另一个功能,它基本上是以下功能: 我会遍历* peasantArray中的所有对象A,如果任何一个农民对象有一个变量var == GameEntityCommandIdling,我会修改第二个NSMutableArray * treeArray中的对象B,
问题是我有时注意到在修改了peasantArray中的对象A后,修改后的变量(var)在对象A中被修改/更新后,以预定的方式打印出变量状态;但是如果我要在下一个计划(1 / 30s)中再次遍历NSMutableArray * peasantArray,我将再次找到具有旧/未更新变量(var)的对象A,这导致我的算法错误,
但是,如果我循环遍历NSMutableArray * peasantArray小于1秒,每次我将对象A的变量(var)正确地视为更新的变量值,
那么我可以通过NSMutableArray迭代的速度有限制吗?
这里是我刚才提到的一些代码,
NSMutableArray *peasantArray;
NSMutableArray *treeArray;
.....
peasantArray = [[[NSMutableArray alloc] initWithCapacity:1]retain];
for(int i = 0; i < 1; i++)
{
Peasant *A = [[Peasant alloc] init];
[peasantArray addObject:A];
}
.... //在update()
中for (int i = 0;i < [peasantArray count];i++)
{
Peasant *A = [peasantArray objectAtIndex:i];
if (A.status == something)
{
printf("A.status is something\n");
A.status = sometingelse;
...
//update other things not related to this NSMutableArray or object
}
}
.....
所以错误是有时候我会有多个printf“A.status是东西”,虽然只打印其中一个,
我非常感谢任何帮助,
谢谢,
答案 0 :(得分:1)
那么我可以通过NSMutableArray迭代的速度有限制吗?
绝对没有。那将是我遇到过的最愚蠢的数组实现。 :)
最简单的解释通常是答案。您说邮件不止一次打印。你有没有检查过,可能不止一个农民的状态设定为什么?
如果情况并非如此,您是否确定状态更新在同一帧中打印两次,而在两次后续更新中不打印两次?
之前您似乎表明,迭代在一个数组上并修改其他数组的对象的效果会以某种方式失效。这让我想指出,如果两个数组中都有相同的对象,修改数组A中对象的属性也会修改数组B中包含的同一对象的属性。
您可能需要give breakpoints a(nother) try。单步执行代码时,问题应该很容易找到。
答案 1 :(得分:0)
这里有内存泄漏
for(int i = 0; i < 1; i++)
{
Peasant *A = [[Peasant alloc] init];
[peasantArray addObject:A];
}
在将数据添加到数组后应释放A,因为addObject会向对象添加引用计数。
for(int i = 0; i < 1; i++)
{
Peasant *A = [[Peasant alloc] init];
[peasantArray addObject:A];
[A release];
}