2015-01-05 34 views
0

我有一個TextFields中的TableView。所述TextFields的值鏈接到二維數組(NSArray的NSMutableArrays)中的某些位置。假設分開的NSArray被編輯副本污染​​

的初始乾淨陣列被定義爲這樣:

self.cleanEditContents = @[ 
         [@[@-1,@-1] mutableCopy], 
         [@[@0,@80] mutableCopy], 
         [@[@0,@500] mutableCopy], 
         [@[@-1,@-1] mutableCopy], 
         [@[@-1,@-1] mutableCopy], 
         [@[@-1,@-1] mutableCopy], 
         [@[@-1,@-1] mutableCopy], 
         [@[@-1,@-1] mutableCopy], 
         [@[@-1,@-1] mutableCopy], 
         [@[@-1,@-1] mutableCopy], 
         [@[@-1,@-1] mutableCopy], 
         [@[@-1,@-1] mutableCopy] 
         ]; 

這個陣列是應該保持與「活性」陣列分開的,使得有源陣列可以是在按下按鈕復位。

我使用self.editContents = [self.cleanEditContents copy];設置活動數組,直接在清潔數組填充和按下按鈕後。

有一個問題,即使我重置數組並調用reloadData和setNeedsLayout(可能會過度殺傷),數字不會重置。我試圖在兩個數組中輸出相同位置的值,結果發現對主動陣列所做的任何更改都會污染干淨的陣列。

回答

2

copy做一個淺拷貝。換句話說,self.editContentsself.cleanEditContents都引用同一組可變數組。所以如果你在一箇中更新一個可變數組,這個變化就會在另一個變化中出現。

要創建self.editContents,請創建一個具有可變內部數組副本的新數組。

NSMutableArray *tmp = [NSMutableArray array]; 
for (NSArray *array in self.cleanEditContents) { 
    [tmp addObject:[array mutableCopy]]; 
} 
self.editContents = tmp; 
+0

您的解決方案給我錯誤。帶'addObject'的行說''NSArray'沒有可見的@interface'聲明選擇器'addObject:'' – JamEngulfer

+0

固定。 'self.editContents'必須聲明爲'NSArray'。 – rmaddy

+0

是的,抱歉,如果我沒有說清楚,那是一個NSArray。這是一個很好的解決方案,謝謝! – JamEngulfer

2

這聽起來像你預期深拷貝

copy方法做了淺拷貝,那就是它只是使數組的副本,而不是項目數組。

所以當你做[self.cleanEditContents copy]新陣列完全相同的項目與原來的。

如果您需要深度複製(或者可能只是一個2級副本),您需要自己編寫代碼。