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

EXC_BAD_ACCESS в для цикла

0 голосов
/ 15 июля 2010

Может кто-нибудь объяснить мне, почему я получаю EXC_BAD_ACCESS на этот кусок кода? Я запускал инструменты с распределением и включенным NSZombie, и там говорилось, что я отправил сообщение зомби, но не вижу, что с ним.

NSMutableArray *keys = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource: @"keys" ofType:@"plist"]];

//format: row, col
id myarray[4][13];

for (int row = 0; row<4; row++){
    for (int col = 0; col<13;col++) {
        myarray[row][col] = [keys objectAtIndex:0];
        if (col < 13) 
            [keys removeObjectAtIndex:0];
    }
}

for (int row = 0; row<4; row++){
    for (int col = 0; col<13;col++) {

        UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        aButton.frame = CGRectMake(5+col*65,5+row*65, 60, 60);
        NSLog(@"%@",myarray[row][col]);
        [aButton setTitle:myarray[row][col] forState:UIControlStateNormal];
        [aButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];         

        [keyboardView addSubview: aButton];
        NSLog(@"%@",myarray[row][col]); //I think it is this NSLog causing problem
    }
}

Вот статистика из инструментов:
альтернативный текст http://i28.tinypic.com/24q1ixc.jpg

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 июля 2010
        myarray[row][col] = [keys objectAtIndex:0];
        if (col < 13) 
            [keys removeObjectAtIndex:0];

Из условия, col всегда < 13, поэтому всегда будет выполняться -removeObjectAtIndex:. Но это будет -release, что [keys objectAtIndex:0] в предыдущей строке. Поскольку myarray[row][col] имеет ту же ссылку с ним, есть вероятность, что он будет освобожден - и это является причиной сбоя позже.

Вы должны -retain объект, чтобы поддержать его, например,

        myarray[row][col] = [[[keys objectAtIndex:0] retain] autorelease];
0 голосов
/ 15 июля 2010

Пробовали после комментирования утверждений NSLog?

...