for循环中的EXC_BAD_ACCESS

时间:2010-07-15 09:35:11

标签: objective-c iphone exception exc-bad-access

任何人都可以告诉我为什么我在这块代码上获得了EXC_BAD_ACCESS?我使用Allocations和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
    }
}

以下是仪器的统计数据:
alt text http://i28.tinypic.com/24q1ixc.jpg

由于

2 个答案:

答案 0 :(得分:2)

        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];

答案 1 :(得分:0)

在评论NSLog语句后尝试过吗?