diff --git a/ChangeLog b/ChangeLog index 3cd7276..83db6fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-09-13 Matt Rice + + * EOControl/EOObserver.m (EOObserverCenter +_forgetObject:): New + private method. + (+notifyObserversObjectWillChange:): Change omniscient observer + arguments. + * EOControl/EOEditingContext.m (NSObject -dealloc): Call + _forgetObject:. + * EOControl/EOPrivate.h: Add category for EOObserverCenter private + methods. + 2006-09-12 David Ayers * Version: Update to 0.10.0 diff --git a/EOControl/EOEditingContext.m b/EOControl/EOEditingContext.m index 0002fb6..90849f2 100644 --- a/EOControl/EOEditingContext.m +++ b/EOControl/EOEditingContext.m @@ -4048,6 +4048,7 @@ static BOOL usesContextRelativeEncoding = NO; [EOAssociationClass objectDeallocated: self]; NSHashRemove(assocDeallocHT,self); } + [EOObserverCenter _forgetObject:self]; /* We cannot if (0) [super dealloc]; as NSObject does not have superclass. */ NSDeallocateObject (self); diff --git a/EOControl/EOObserver.m b/EOControl/EOObserver.m index becf38d..0ce361f 100644 --- a/EOControl/EOObserver.m +++ b/EOControl/EOObserver.m @@ -172,6 +172,11 @@ static id lastObject; } } ++ (void)_forgetObject:(id)object +{ + if (lastObject == object) lastObject = nil; +} + /** * This method is invoked from [NSObject-willChange] to dispatch * [EOObserving-objectWillChange:] to all observers registered @@ -191,16 +196,21 @@ static id lastObject; if (!notificationSuppressCount) { + SEL objectWillChangeSel = @selector(objectWillChange:); EOFLOGObjectLevelArgs(@"EOObserver", @"object=%p lastObject=%p", object, lastObject); if (object == nil) - lastObject = nil; + { + lastObject = nil; + [omniscientObservers makeObjectsPerform:objectWillChangeSel + withObject:nil]; + + } else if (lastObject != object) { GDL2NonRetainingMutableArray *observersArray; int c; - SEL objectWillChangeSel = @selector(objectWillChange:); lastObject = object; @@ -215,7 +225,7 @@ static id lastObject; EOFLOGObjectLevelArgs(@"EOObserver", @"omniscientObservers count=%d", c); [omniscientObservers makeObjectsPerform:objectWillChangeSel - withObject:nil]; + withObject:object]; } } diff --git a/EOControl/EOPrivate.h b/EOControl/EOPrivate.h index 5276c5b..67a9d44 100644 --- a/EOControl/EOPrivate.h +++ b/EOControl/EOPrivate.h @@ -29,6 +29,7 @@ #include #include +#include #include "EODefines.h" @class NSNumber; @@ -376,6 +377,10 @@ GDL2CONTROL_EXPORT void EOHashAddTable(NSHashTable *to, NSHashTable *from); - (void) registerAssociationForDeallocHack:(id)object; @end +@interface EOObserverCenter(EOPrivate) ++ (void) _forgetObject:(id)object; +@end + @interface GDL2NonRetainingMutableArray : NSMutableArray { void *_contents;