2010-09-28 135 views
0

給予EXC_BAD_ACCESS我在我的方法中定義的C數組爲:陣列在for循環

int c = 4; 
int r = 5; 
keysArray[c][r]; 

我有這樣的for循環,其工作方式,填充作爲預期keysArray

for (int row = 0; row < r; row++) { 
    for (int column = 0; column < c; column++){ 
     keysArray[column][row] = [anotherArray objectAtIndex:0]; 
     NSLog(@"array1 %@",keysArray[column][row]); 
     [anotherArray removeObjectAtIndex:0]; 
    } 
} 

然後,在for循環下,恰好具有同樣的循環計數器的結構,當我嘗試的NSLog陣列,它給出了一個EXC_BAD_ACCESS。

for (int row = 0; row < r; row++){ 
    for (int column = 0; column < c; column++) {    
     NSLog(@"array2: %@",keysArray[column][row]); //EXC_BAD_ACCESS here 
    } 
} 

假如在方法體中定義了keysArray,在兩組循環之外定義了keysArray,會導致這種情況發生嗎?

回答

0

您需要保留的對象,我會用的NSMutableArray的NSMutableArray中舉行你的C數組。 Unlikes一個NS *數組,C數組在添加到數組時不會保留。

但是,對於這樣的無孔二維數組,我只使用一個NSMutableArray。任何N維數組都可以用簡單的數學表示爲線 - 作爲一維數組。

也就是說,要確定(X,Y)處的對象的索引,請使用(Y * width) + X)

唯一需要注意的是NS*Array不支持「孔」。您將需要逐行填充數組。也就是說,對於一個3×4(3寬,4高)陣列,你將填補它的順序0,01,02,00,11,1等..

顯然,insertremove操作將搞亂你2D表示(但它們也會在NSMutableArraysNSMutableArray中)。

或者,使用NSPointerArray,因爲它可能有孔。

1

anotherArray的內容是否由其他對象保留?如果不是,它們在第二個循環中不再存在。 WTH是否使用C數組存儲Objective-C對象?

int c = 4; 
int r = 5; 
NSMutableArray *keysArray = [[NSMutableArray alloc] initWithCapacity:c]; 

for (int column = 0; column < c; column++) { 
    [keysArray addObject:[NSMutableArray arrayWithCapacity:r]]; 
    for (int row = 0; row < r; row++) { 
     [[keysArray objectAtIndex:column] addObject:[anotherArray objectAtIndex:0]]; 
     [anotherArray removeObjectAtIndex:0]; 
    } 
} 

for (int row = 0; row < r; row++){ 
    for (int column = 0; column < c; column++) {    
     NSLog(@"array2: %@", [[keysArray objectAtIndex:column] objectAtIndex:row]); 
    } 
} 
+0

我需要一個多維數組來存儲網格中按鈕的行/列位置,使用C數組是我能想到的最簡單的方法,除非您可以建議更合適的方法嗎?爲什麼重要的是另一個數組是否保留在其他地方,而不是現在它的內容存儲在keysArray中?另一個陣營是伊娃。 – joec 2010-09-28 11:09:06

+0

這不是關於'anotherArray'被保留,而是關於其內容。通過從陣列中刪除它們,它們正在被釋放。如果你沒有在別處保留它們,它們將被釋放。二維數組只是一個數組數組。你也可以很容易地用'NSMutableArrays'完成它:'[[columns objectAtIndex:column] objectAtIndex:row];' – 2010-09-28 11:13:17

+0

好吧,我現在已經使用Objective C數組實現了它,但是現在仍然失敗。將它們存儲在可變數組中不會保留它們嗎? – joec 2010-09-28 11:33:00

0

難道這是問題:

[anotherArray removeObjectAtIndex:0]; 
0

嘗試

keysArray[column][row] = [[anotherArray objectAtIndex:0] retain]; 

但如果我是你,而不是

+0

我會創建一個新類來包裝C數組 – JeremyP 2010-09-28 16:13:24

+0

@JeremyP是的,那會更好。 – 2010-09-29 01:32:32