Hey Ken, thanks for your reply. > Are you sure that PrefCtrl is returning the same proxy each time?
Yes. The proxy object is setup in PrefCtrl's -init, and is never changed. > Also, at the time that you invoke -willChangeValueForKey: have you already > changed your internal state such that invoking [theProxy > valueForKey:@"someFeature"] returns the "after" value? It should still > return the "before" value at that point. It must not return the "after" > value until after the -willChangeValueForKey: call completes. I'm changing the value of the 'someFeature' key after willChange, and before didChange. That is, from the context of PrefCtrl: // #1: value for 'someFeature' is nil at this point [self willChangeValueForKey: @"values"]; // #2: value for 'someFeature' is still nil at this point [valuesDictionary setValue: someFeature forKey: @"someFeature"]; // #3 value for 'someFeature' is NOT nil at this point [self didChangeValueForKey: @"values"]; // #4 value for 'someFeature' is the same as point #3 (still not nil) (Note that valuesDictionary is PrefCtrl's underlying backing store for all the prefs.) > That's what it's complaining about. It's saying that [theProxy > valueForKey:@"someFeature"] isn't the same object it was when the > observation was established, so KVO can't unhook itself from the object it > had earlier hooked into. Note that it's attempting this unwinding during > -willChangeValueForKey:. Of course, that object won't be the same _after_ > -willChangeValueForKey: -- you are, after all, changing it -- but it needs > it to be the same _at_ -willChangeValueForKey: for KVO's housekeeping to > work. I'm not sure if it's relevant, but does it matter that someFeature is originally nil - I'm assuming it couldn't possibly have an observer before I change the value to something non-nil...? > Also, since KVO was watching the "someFeature" property of the proxy, and > that property is different than it was, but KVO never noticed that it > changed, it's reporting that the property changed in a non-KVO-compliant > fashion. Since you are using a proxy to front for your PrefCtrl, are you > also making sure that all changes of PrefCtrl's properties cause change > notifications for the proxy's virtual properties? That is, are you > forwarding all -will/didChange... invocations on your PrefCtrl object to > your proxy, at least for keys other than "values"? That's precisely my issue - because the prefs can be changed from other processes, the app doesn't know which specific properties changed - all it knows is that there was a change. Of course I could find out what specific changes occurred by comparing the new prefs with the old prefs, but I find it far more convenient just to issue a blanket willChange/didChange: @"values". To emulate this situation, in my example project I use the code above, which modifies PrefCtrl's 'valuesDictionary' backing store directly, surrounded by the willChange/didChange: @"values". I've tried sending individual willChange/didChange for every key that's in PrefCtrl - and it works - I just don't understand why just sending willChange/didChange: @"values doesn't (at least for a 3+ segment key path.) Again, the example project that exhibits this issue is here: http://www.docdave.com/kvo_project.zip > You may be able to eliminate the proxy altogether, by the way. Have you > tried having the "values" property of the PrefCtrl object just return "self" > -- the PrefCtrl object itself? That would avoid the need to forward things > in either direction, but still give you the ability to will/didChange... the > "values" property to provoke a wholesale updating of all observers of any > properties. At least, I think that should work. I decided to go the proxy route simply because PrefCtrl has some of its own properties that I didn't want to get confused with actual preferences... to me, it just seems cleaner. Thanks! David _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com