Peter ┼átibraný Peter ┼átibraný - 6 months ago 30
Objective-C Question

Why doesn't setValue:forKeyPath invoked on mutable dictionary throw exception for unknown keypaths?

I have following code:

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


I understand that
setObject:forKey:
creates association between "test1.test2.test3" key and given number object. On the other hand,
setValue:forKeyPath:
is Key-Value-Coding method that tries to locate object for path "test2.test3.test4", but in the end, it just silently does nothing. It doesn't even modify the dictionary!

What confuses me greatly is that
setValue:forKeyPath:
doesn't raise any exception nor does it report any error. Why is this? Is this behavior documented anywhere?

Answer

I can't find any documentation for this specific case, sorry, but my guess is that this:

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

Is being implemented something like this:

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

So objectForKey: returns nil, and methods called on nil just do nothing. That would explain the behaviour you have described.

Comments