2013-07-17 49 views
2

我有一個由許多小陣列組成的oldArray。 現在我想採取這些對象之一(一個小陣列),修改它,然後(如果用戶點擊一個按鈕)替換它。 要做到這一點:iOS:將一個對象從oldArray複製到newArray

步驟1 - 我做了一個新的數組,其中我用這個小對象初始化newArray。

openedCartProduct = nil; 
openedCartProduct = [NSMutableArray array]; 
[openedCartProduct addObjectsFromArray: [SharedAppDelegate.myEngine.shoppingCart objectAtIndex:indexPath.row]]; 

第2步 - 修改數組。

[[openedCartProduct objectAtIndex:0] setObject:[NSNumber numberWithFloat:[inputRabatLabel.text floatValue]] forKey:kRABAT_KEY]; 

第3步 - 替換oldArray中的對象。

在步驟2中,即使在替換對象之前,修改也在oldArray中發生。我在這裏錯過了什麼嗎?

在此先感謝你們! :)

編輯: 修改的對象是一個小型數組,包括我正在修改索引0的NSMutableDictionary。

編輯 似乎我們需要一個深度拷貝在這裏。我發現了一個解決方案,是一個黑客攻擊的,但是,但做工精細,並且很簡單:

openedCartProduct = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:[SharedAppDelegate.myEngine.shoppingCart objectAtIndex:indexPath.row]]]; 
+2

第二步對數組沒有意義。 setObject:forKey:是一個NSMutableDictionary方法。 – ahwulf

+0

對象(小數組)中有兩個對象。索引0處的那個是一個NSMutableDictionary,我爲其中一個鍵設置了一個特定的值。 –

+0

嘗試使用arrayWithArray而不是addObjectsFromArray。 – satheeshwaran

回答

1

您複製到原來的小數組的引用。所以當你改變它時,它指向第一個數組中的小數組。包含所有原始內容。如果你想改變它而不改變它在第一個數組中,你需要執行一個副本,在這種情況下是一個深層副本,因爲它包含一個mutableDictionary(我假設你也想複製)。

+0

這是正確的。我明白這是發生了什麼事。深度複製,我必須手動設置值和密鑰? –

+0

在你的簡單情況下,你可以在改變它之前創建一個內部可變字典的副本。我正在研究我自己的代碼,以瞭解我如何完成深層副本。如果我記得我曾經使用過一種使用JSONSerialization的破解方式 - 但是爲你尋找更好的答案 – KHansenSF

+0

嗯......必須有一個更簡單的方法。我也會試試看... –

相關問題