I'm using KVO as a generalized recalculation engine, somewhat akin to how a 
spreadsheet recalcuates values based on what's changed. It's mostly successful 
once you eliminate cycles, but there is a persistent problem.

On each relevant object, I have a 
observeValueForKeyPath:ofObject:change:context: method which then triggers 
willChangeValueForKey:  / didChangeValueForKey: for dependent properties. I've 
noticed that when observeValueForKeyPath:ofObject:change:context gets called 
more than once in a row for an object, one of the other observed objects dies 
in didChangeValueForKey: -- here's the stack trace

Program received signal:  “EXC_BAD_ACCESS”.

#0      0x7fff84d31ae1 in NSKVOPendingNotificationRelease
#1      0x7fff88aa0bd3 in __CFArrayReleaseValues
#2      0x7fff88a815f8 in _CFArrayReplaceValues
#3      0x7fff84d31e35 in NSKeyValuePopPendingNotificationPerThread
#4      0x7fff84d31dca in NSKeyValueDidChange
#5      0x7fff84d1574f in -[NSObject(NSKeyValueObserverNotification) 
didChangeValueForKey:]
#6      0x1000181c8 in -[CMEdge didChangeValueOnceForKey:] at CMEdge.m:133
#7      0x100019f51 in -[CMNode 
observeValueForKeyPath:ofObject:change:context:] at CMNode.m:222

The only workaround is to perform the didChangeValueForKey: in the next event 
cycle i.e. by using performSelectorOnMainThread:withObject:waitUntilDone:

Not really ideal especially since I'm worried I'm just covering up the root of 
the problem, whatever it is.

Any ideas on the cause?

Side question: I can of course use keyPathsForValuesAffectingValueForKey: and 
friends to declare the dependencies instead of using a procedure to react to 
them, but I need to execute code as well e.g. update the observed value. For 
example, say A = B/C. When either B or C changes, you want A to change too. I 
can use keyPathsForValuesAffectingA to declare it depends on B or C, but I need 
to update the cached A value whenever B or C changes -- how would I do that 
without using observeValueForKeyPath:ofObject:change:context:?

Cheers
Glen Low
Pixelglow Software_______________________________________________

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

Reply via email to