Почему не setValue: forKeyPath вызывается в непостоянном исключении словаря для неизвестных путей? - PullRequest
2 голосов
/ 22 апреля 2011

У меня следующий код:

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: - это метод Key-Value-Coding, который пытается найти объект по пути "test2.test3.test4", но в конце он просто ничего не делает.Он даже не изменяет словарь!

Меня очень смущает то, что setValue:forKeyPath: не вызывает никаких исключений и не сообщает об ошибках.Почему это?Задокументировано ли это поведение где-нибудь?

Ответы [ 2 ]

5 голосов
/ 22 апреля 2011

Я не могу найти никакой документации для этого конкретного случая, извините, но я думаю, что это:

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

Реализуется что-то вроде этого:

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

Итак, objectForKey: возвращает nil, а методы, вызываемые на nil, просто ничего не делают. Это объясняет поведение, которое вы описали.

0 голосов
/ 20 мая 2016
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
...