2011-04-22 44 views
2

我有以下代碼:爲什麼setValue:forKeyPath對可變字典調用拋出未知keypaths的異常?

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
[defs setObject:[NSNumber numberWithInt:100] forKey:@"test1.test2.test3"]; 
[defs setValue:[NSNumber numberWithInt:10] forKeyPath:@"test2.test3.test4"]; 

我明白setObject:forKey:創建「test1.test2.test3」鍵和給定數量的對象之間的關聯。另一方面,setValue:forKeyPath:是一種鍵值編碼方法,它嘗試爲路徑「test2.test3.test4」定位對象,但最後它只是默默無聞。它甚至不修改字典!

令我非常困惑的是setValue:forKeyPath:不會引發任何異常,也不報告任何錯誤。爲什麼是這樣?這種行爲是否在任何地方記錄?

回答

4

我找不到這種特殊情況下的任何文件,很抱歉,但我的猜測是這樣的:

[defs setValue:x forKeyPath:@"a.b.c"]; 

正在實施這樣的事情:

[[defs objectForKey:@"a"] setValue:x forKeyPath:@"b.c"]; 

所以objectForKey:回報nil ,並且在nil上調用的方法只是無所作爲。這將解釋你所描述的行爲。

+0

謝謝。這確實可以解釋沉默:-( – 2011-04-22 14:03:24

-1
NSMutableDictionary *dict = [@{@"test1" : [@{@"test2":[@{} mutableCopy]} mutableCopy]} mutableCopy]; 

[dict setValue:@(100) forKeyPath:@"test1.test2.test3"]; // ok 
[dict setValue:@(200) forKeyPath:@"test1.test2.test4"]; // ok 
[dict setValue:@(300) forKeyPath:@"test1.test21"];  // ok 
[dict setValue:@(400) forKeyPath:@"test1.test22.test3"]; // fail, test22 not mutable 

[dict setValue:[@{} mutableCopy] forKeyPath:@"test1.test23"]; // ok 
[dict setValue:@(500) forKeyPath:@"test1.test23.test34"]; // ok 
+0

請檢查此[URL](http://stackoverflow.com/help)它將有助於提高您的內容質量 – 2016-05-20 03:20:02

相關問題