2010-08-27 209 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