2012-08-13 58 views
1
// populate 'project' with contents of key in `gDictRoot` 
NSDictionary *project = [gDictRoot valueForKeyPath:@"root.project0"]; 

// modify 'project' as necessary - actual code omitted for brevity 
[project setValue:[someDict valueForKey:@"foo"] forKeyPath:@"parameters.foo"]; 

// add 'project' to 'gDictRoot' so it isn't lost when the view is dismissed 
[gDictRoot setValue:project forKeyPath:@"root.project2"]; 

三線,在這裏我想補充projectgDictRoot - project0也被修改。不知道爲什麼。的NSMutableDictionary setValue方法:forKeyPath:設置多個鍵

+1

什麼'的NSLog(@ 「%P%P」,[gDictRoot valueForKeyPath:@「root.project0 「],[gDictRoot valueForKeyPath:@」root.project2「]);'給你嗎? – 2012-08-13 15:12:41

+0

'0x6b9cc10 0x6b9cc10' ...我接受它我不正確地初始化'項目'? – Thromordyn 2012-08-13 15:14:58

+2

您正在將它初始化爲指向根詞典中位於'@「root.project0」'處的同一事物的指針。也許你想要一個副本? – 2012-08-13 15:16:28

回答

2

您看到的行爲是由於project0project2都指向同一字典實例。對其中一個的改變將永遠反映在另一箇中。

如果不希望這種行爲,使project0副本使其project2前:

NSMutableDictionary *project = [NSMutableDictionary 
    dictionaryWithDictionary:[gDictRoot valueForKeyPath:@"root.project0"] 
]; 
+0

認爲它工作。沒那麼多。 – Thromordyn 2012-08-13 16:39:05

+0

@Thromordyn這將複製第一級對象,但對第二級,第三級和更高級別對象的引用將保持不變。如果您需要更深入的克隆,請參閱此[問題](http://stackoverflow.com/q/1950361/335858)和[答案](http://stackoverflow.com/a/1950404/335858)。 – dasblinkenlight 2012-08-13 16:46:07

+0

我明白了。必須再次循環。這或從plist讀取,因爲這是我最終最終會做的。謝謝您的幫助。 – Thromordyn 2012-08-13 17:05:19

相關問題