Summary:
You do not need to add an observer twice for the same key just because the keys in the middle are changed, NSKeyValueObserving does this for you.
As long as your -oldestOrder method -oldestOrder not return a -oldestOrder pointer, nothing should break.
How KVO works, when you add yourself as an observer, the observer is added to the list of the observed object as an NSObservationInfo object. Easy. The NSObservationInfo object is just a raw key (not a path), an object to observe, an observer to call, a pointer to the context that you passed, and some other accounting materials.
When you observe the key path, observer relationships are observed through the corresponding NSObservationInfo objects, which are stored in the list of the called object, as if the entire path was a property of the object that you named -addObserver on.
In your self example, restaurant is observed, but the addObserver: method creates NSObservationInfo objects in the background that are added as observers for each corresponding object along the way, and they are also added to your observer list.
When you watch the @"ABCD" object, it creates four NSObservationInfo , one for each key relationship, and they are added to each key on the path as an observer, so you get a view of the NSObservationInfo A object, one looking at B from A , one looking through C from B etc. When one of these NSObservationInfo objects observes a change, it passes it along with the original -addObserver calling as a change to the entire keychain.
(This is an implementation detail, but it should help explain.)
When an object in the middle of the path is nild or deleted, -willChangeValueForKey notices this and dutifully deletes NSObservationInfo objects as observers along the path after the nil'd object. These NSObservationInfo objects still exist, and they still know what keys they want to see, and when -didChangeValueForKey is -didChangeValueForKey , it will look at the new value for the key, and if it has key names that match the NSObservationInfo objects , he will attach them to new observers.
So, when any element along the path @"restaurant.oldestOrder.patron.frustrationLevel" changes, you will receive a notification about the change, but the NSKeyValueObserving mechanism will try to restore relations with the key at the end of this path after the change, and any subsequent change.
Here's Cocoatron's doing this , you can see how it works on its own.