我在我的方法中定义了一个C数组:
int c = 4;
int r = 5;
keysArray[c][r];
我有这个for循环,它起作用,按预期填充keysArray
。
for (int row = 0; row < r; row++) {
for (int column = 0; column < c; column++){
keysArray[column][row] = [anotherArray objectAtIndex:0];
NSLog(@"array1 %@",keysArray[column][row]);
[anotherArray removeObjectAtIndex:0];
}
}
然后在下面的for循环中,具有完全相同的循环计数器结构,当我尝试NSLog数组时,它给出了一个EXC_BAD_ACCESS。
for (int row = 0; row < r; row++){
for (int column = 0; column < c; column++) {
NSLog(@"array2: %@",keysArray[column][row]); //EXC_BAD_ACCESS here
}
}
如果在方法体中定义keysArray,在两组循环之外,会导致这种情况发生吗?
答案 0 :(得分:1)
anotherArray
的内容是否被其他对象保留了?如果不是,它们在第二个循环中不再存在。您是否正在使用C数组来存储Objective-C对象?
int c = 4;
int r = 5;
NSMutableArray *keysArray = [[NSMutableArray alloc] initWithCapacity:c];
for (int column = 0; column < c; column++) {
[keysArray addObject:[NSMutableArray arrayWithCapacity:r]];
for (int row = 0; row < r; row++) {
[[keysArray objectAtIndex:column] addObject:[anotherArray objectAtIndex:0]];
[anotherArray removeObjectAtIndex:0];
}
}
for (int row = 0; row < r; row++){
for (int column = 0; column < c; column++) {
NSLog(@"array2: %@", [[keysArray objectAtIndex:column] objectAtIndex:row]);
}
}
答案 1 :(得分:0)
这可能是问题所在:
[anotherArray removeObjectAtIndex:0];
答案 2 :(得分:0)
尝试
keysArray[column][row] = [[anotherArray objectAtIndex:0] retain];
虽然如果我是你,我会使用NSMutableArray来代替
答案 3 :(得分:0)
您需要保留C数组中保存的对象。不喜欢NS *数组,C数组在添加到数组时不会保留。
然而,对于像这样的无孔2D数组,我只使用一个NSMutableArray。任何N维数组都可以用一个简单的数学表示为一条线 - 作为一维数组。
即,要确定(X,Y)处对象的索引,请使用(Y * width) + X)
。
唯一需要注意的是NS*Array
不支持“漏洞”。您需要逐行填充数组。也就是说,对于3x4(3宽,4高)阵列,您可以按0,0
,1,0
,2,0
,0,1
,{{1}的顺序填充它等等...
显然,1,1
和insert
操作会破坏您的2D表示(但它们也会remove
NSMutableArray
。
或者,使用NSMutableArrays
,因为它可能有漏洞。