数组在for循环中给出EXC_BAD_ACCESS

时间:2010-09-28 10:59:19

标签: objective-c iphone arrays ios4 exc-bad-access

我在我的方法中定义了一个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,在两组循环之外,会导致这种情况发生吗?

4 个答案:

答案 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,01,02,00,1,{{1}的顺序填充它等等...

显然,1,1insert操作会破坏您的2D表示(但它们也会remove NSMutableArray

或者,使用NSMutableArrays,因为它可能有漏洞。