更新后,NSMutableArray中的对象不会立即更新

时间:2012-01-11 12:16:37

标签: objective-c xcode cocos2d-iphone nsmutablearray

我在cocos2d / xcode

中使用NSMutableArray时出现了一个非常奇怪的错误

在我的代码中,我有一个包含对象A

的NSMutableArray
NSMutableArray *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是东西”,虽然只打印其中一个,

我非常感谢任何帮助,

谢谢,

2 个答案:

答案 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];
}