Массив, передающий EXC_BAD_ACCESS для цикла for - PullRequest
0 голосов
/ 28 сентября 2010

У меня есть массив 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 ]

1 голос
/ 28 сентября 2010

Содержимое anotherArray сохраняется каким-либо другим объектом? Если нет, они больше не существуют во втором цикле. WTH вы используете массив 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]);
    }
}
0 голосов
/ 28 сентября 2010

Вам необходимо сохранить объекты, хранящиеся в вашем массиве C. Не нравится NS * Array, массив C не сохраняется при добавлении в массив.

Однако для такого двумерного массива без отверстий я бы просто использовал один NSMutableArray. Любой N-мерный массив может быть представлен как линия - как одномерный массив - с простой математикой.

А именно, чтобы определить индекс объекта в (X, Y), используйте (Y * width) + X).

Единственное предостережение в том, что NS*Array не поддерживает "дыры". Вам нужно будет заполнять массив построчно. То есть для массива 3x4 (3 в ширину, 4 в высоту) вы должны заполнить его в следующем порядке: 0,0, 1,0, 2,0, 0,1, 1,1 и т. Д.

Очевидно, что операции insert и remove испортят ваше 2D-представление (но в NSMutableArray из NSMutableArrays тоже).

В качестве альтернативы используйте NSPointerArray, так как в нем могут быть отверстия.

0 голосов
/ 28 сентября 2010

try

keysArray[column][row] = [[anotherArray objectAtIndex:0] retain];

хотя на вашем месте я бы использовал NSMutableArray из NSMutableArray

0 голосов
/ 28 сентября 2010

Может ли это быть проблемой:

[anotherArray removeObjectAtIndex:0];
...