for循环中的EXC_BAD_ACCESS

时间:2010-08-27 14:36:57

标签: iphone crash for-loop exc-bad-access

在这段代码中,在第二个for循环中,如果我使用i和j以外的标识符,我会得到一个EXC_BAD_ACCESS。

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 个答案:

答案 0 :(得分:1)

你的专栏:

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

我不是Objective-C专家或任何东西,但我不确定你是否需要自动释放该对象,因为你没有为它分配内存。当您尝试删除该自动释放时会发生什么?

我怀疑是在您自动释放对象然后尝试在此处分配数组值之后:

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

你正在获得EXC_BAD_ACCESS。

我可能是错的,在这种情况下,我希望比我聪明的人可以清除它。 :)

答案 1 :(得分:0)

在你的第一个循环中,你在第二个循环中引用keysArray[row][col],你似乎正在使用keysArray[col][row],如果numRows和numCols不同会导致它崩溃