我正在尝试创建一个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];
正在同时进行?如果是这样,我该如何一个接一个地执行这些行动?
如果没有,我做错了什么?
答案 0 :(得分:3)
试试这个,
[layer addObject:[row copy]];
答案 1 :(得分:1)
您要将row
添加到layer
,但随后您将其清空。
我理解你为什么这样做,因为你想重复使用row
和layer
。然而,它不是在Objective-C中如何工作,因为变量只是对象的引用(C指针)。
您需要做的是在循环外创建all
,并在内循环内重新创建row
和layer
。您可以重用变量,但底层对象需要更改。
试试这个:
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];
}
好吧,别人打得更快。哪个更好,因为你看到两个相同的程序结构,几乎相同的代码。这是因为任务很明确,而且任何有经验的程序员都可以通过一种方式构建代码。