【问题标题】:object inside NSMutableArray is not update immediately after updatingNSMutableArray 中的对象在更新后不会立即更新
【发布时间】:2012-01-11 12:16:36
【问题描述】:

我在 cocos2d/xcode 中使用 NSMutableArray 遇到一个非常奇怪的错误

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

NSMutableArray *peasantArray;

另一个 NSMutableArray 包含对象 B

NSMutableArray *treeArray;

在定时更新函数中,我调用了另一个函数,它本质上是以下功能: 我会遍历 *peasantArray 中的所有对象 A,如果任何农民对象有一个变量 var == GameEntityCommandIdling,我会修改第二个 NSMutableArray *treeArray 中的对象 B,

问题是我注意到有时在我修改了农夫数组中的对象 A 之后,修改后的变量 (var) 在对象 A 中被修改/更新,之后通过以预定方式打印出变量状态;但是如果我要在下一个时间表(1/30 秒)中再次循环遍历 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
    }
}

.....

所以错误是有时我会有多个“A.status is something”的printf,尽管应该只打印其中一个,

非常感谢任何帮助,

谢谢,

【问题讨论】:

  • status 是什么类型?是NSString吗?

标签: objective-c xcode cocos2d-iphone nsmutablearray


【解决方案1】:

那么对 NSMutableArray 的迭代速度有限制吗?

绝对没有。那将是我遇到过的最愚蠢的数组实现。 :)

最简单的解释通常就是答案。你说消息被打印了不止一次。那么你有没有检查过可能不止一个农民的状态设置为什么?

如果不是这样,您确定状态更新会在同一帧中打印两次,而不是在随后的两次更新中打印两次吗?

您之前似乎表明迭代一个数组并修改另一个数组的对象的效果以某种方式无效。这让我想指出,如果您在两个数组中都有相同的对象,那么修改数组 A 中对象的属性也会修改数组 B 中包含的同一对象的属性。

您可能想give breakpoints a(nother) try。单步执行代码时应该很容易找到问题。

【讨论】:

  • 谢谢,错误与您的回答有些相似。我错误地修改了同一个对象A变量(var),
【解决方案2】:

这里有内存泄漏

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

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 2022-09-28
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多