2010-08-27 175 views
0

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

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来避免丢失一个,但它仍然崩溃。

感谢

+0

你能提供一个例子和/或澄清什么或者不会导致崩溃?在这个例子中,你使用的是i/j ... – nessence 2010-08-27 14:42:49

回答

0

您是在第二循环中引用keysArray[row][col]你的第一个循环,你似乎可以用keysArray[col][row]这将导致崩溃,如果和numRows行数numCols不同

1

你行:

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

我不是一个Objective-C的专家或什么,但我不能确定你需要自动释放该对象,因为你还没有分配的内存为了它。当你尝试删除autorelease时会发生什么?

我怀疑是你自动释放的对象,然后后尝试在此指定数组值:

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

你得到EXC_BAD_ACCESS。

我可能是错的,在这种情况下,我希望有人比我更聪明的可以解决这个问题。 :)

+0

“保留”意味着你拥有所有权,所以你应该释放它。 – cobbal 2010-08-27 19:00:28