循环期间在NSMutableArray中丢失数据

时间:2014-04-04 21:17:21

标签: ios objective-c loops nsmutablearray

我正在尝试创建一个NSMutableArray,以便我可以填充地图。但是在“[row removeAllObjects];”之后立即它也会删除“layer”数组中的所有对象。

NSMutableArray *row = [[NSMutableArray alloc] init];
NSMutableArray *layer = [[NSMutableArray alloc] init];
NSMutableArray *all = [[NSMutableArray alloc] init];

int blockType = 0;
for (int y = 0; y<10; y++) {
    for (int x = 0; x<10; x++) {
        for (int z = 0; z<10; z++) {
            if (y<5) blockType = 0;
            else blockType = arc4random() % 2 + 1;
            [row addObject:[NSNumber numberWithInt:blockType]];
        }
        [layer addObject:row];
        [row removeAllObjects];
    }
    [all addObject:layer];
    [layer removeAllObjects];
}

是因为

        [layer addObject:row];
        [row removeAllObjects];

正在同时进行?如果是这样,我该如何一个接一个地执行这些行动?

如果没有,我做错了什么?

4 个答案:

答案 0 :(得分:3)

试试这个,

[layer addObject:[row copy]];

答案 1 :(得分:1)

您要将row添加到layer,但随后您将其清空。

我理解你为什么这样做,因为你想重复使用rowlayer。然而,它不是在Objective-C中如何工作,因为变量只是对象的引用(C指针)。

您需要做的是在循环外创建all,并在内循环内重新创建rowlayer。您可以重用变量,但底层对象需要更改。

试试这个:

NSMutableArray *all = [[NSMutableArray alloc] init];
NSMutableArray *row;
NSMutableArray *layer;

int blockType = 0;

for (int y = 0; y < 10; y++) {
    layer = [[NSMutableArray alloc] init];

    for (int x = 0; x < 10; x++) {
        row = [[NSMutableArray alloc] init];

        for (int z = 0; z < 10; z++) {
            if (y < 5)
                blockType = 0;
            else
                blockType = arc4random() % 2 + 1;

            [row addObject:[NSNumber numberWithInt:blockType]];
        }

        [layer addObject: row];
    }

    [all addObject: layer];
}

答案 2 :(得分:0)

NSMutableArray *row = [[NSMutableArray alloc] init];移至for (int x = 0; x<10; x++) {之后,并完全删除[row removeAllObjects];

答案 3 :(得分:0)

你创建了一个有问题的程序结构,它会在后面咬你。

for (int z = 0; z<10; z++) {
    if (y<5) blockType = 0;
    else blockType = arc4random() % 2 + 1;
    [row addObject:[NSNumber numberWithInt:blockType]];
}
[layer addObject:row];
[row removeAllObjects];

此代码应该创建一个包含10个数字的数组,并将其添加到数组&#34; layer&#34;。但那不是它的作用。该阵列早已创建。并添加结束,它清空数组以准备下一次迭代。那是一个糟糕的结构。正确的结构将是:

NSMutableArray* row = [NSMutableArray array];        
for (int z = 0; z<10; z++) {
    if (y<5) blockType = 0;
    else blockType = arc4random() % 2 + 1;
    [row addObject:[NSNumber numberWithInt:blockType]];
}
[layer addObject:row];

这正是它应该做的事情:创建一个数组,用数据填充它,将它添加到图层。不依赖于以前和以下的代码。完整的工作代码是:

NSMutableArray *all = [[NSMutableArray alloc] init];
for (int y = 0; y<10; y++) {
    NSMutableArray *layer = [[NSMutableArray alloc] init];
    for (int x = 0; x<10; x++) {
        NSMutableArray *row = [[NSMutableArray alloc] init];
        for (int z = 0; z<10; z++) {
            int blockType = y < 5 ? 0 : arc4random() % 2 + 1;
            [row addObject:[NSNumber numberWithInt:blockType]];
        }
        [layer addObject:row];
    }
    [all addObject:layer];
}

好吧,别人打得更快。哪个更好,因为你看到两个相同的程序结构,几乎相同的代码。这是因为任务很明确,而且任何有经验的程序员都可以通过一种方式构建代码。