EXC_BAD_ACCESS в для цикла - PullRequest
       14

EXC_BAD_ACCESS в для цикла

0 голосов
/ 27 августа 2010

В этом коде во втором цикле for я получаю EXC_BAD_ACCESS, если я использую идентификатор, отличный от i и j.

if (UIDeviceOrientationIsPortrait(deviceOrientation)){
    numRows = 4;
    numCols = 3;
}else {
    numRows = 6;
    numCols = 1;
}

for (int row = 0; row < numRows; row++){        
    for (int col = 0; col < numCols; col++) {
        keysArray[row][col] = [[[keys objectAtIndex:0] retain] autorelease];
        if (col < numRows) 
            [keys removeObjectAtIndex:0];
    }
}

//Here is the crash

for (int i = 0; i < numRows; i++) {
    for (int j = 0; j < numCols; j++){
        UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
        b.frame = CGRectMake(i * kKeyGap, j * kKeyGap, 57, 57);
        [b setImage: [UIImage imageNamed:keysArray[j][i]] 
                                  forState:UIControlStateNormal];


        [self.view addSubview:b];
    }
}

Почему это вызвало бы такую ​​ошибку? Я пытался использовать Edit All In Scope, чтобы не пропустить ни одного, но все равно вылетает.

Спасибо

Ответы [ 2 ]

1 голос
/ 27 августа 2010

Ваша линия:

keysArray[row][col] = [[[keys objectAtIndex:0] retain] autorelease];

Я не эксперт Objective-C или что-то в этом роде, но я не уверен, что вам нужно автоматически высвобождать этот объект, потому что вы не выделили ему память. Что происходит, когда вы пытаетесь удалить этот авто-релиз?

Я подозреваю, что после того, как вы автоматически освободите объект, а затем попытаетесь присвоить значение массива здесь:

[b setImage: [UIImage imageNamed:keysArray[j][i]] 
                              forState:UIControlStateNormal];

вы получаете EXC_BAD_ACCESS.

Я могу ошибаться, и в этом случае я надеюсь, что кто-то умнее меня сможет это прояснить. :)

0 голосов
/ 27 августа 2010

В первом цикле вы ссылаетесь на keysArray[row][col], во втором цикле вы, похоже, используете keysArray[col][row], что приведет к его аварийному завершению, если numRows и numCols различаются

...