diff --git a/ChangeLog b/ChangeLog index a6a4c2144..11d1d40f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-06-22 Fred Kiefer + + * Source/NSKeyValueBinding.m (GSKeyValueBinding+initialize): + Correc the setup of the map tables. + * Source/NSKeyValueBinding.m (GSKeyValueBinding+unbindAllForObject): + Use a copy of the keys for the enumerator. + 2009-06-05 18:21-EDT Gregory John Casamento * Headers/AppKit/NSSpeechSynthesizer.h: diff --git a/Source/NSKeyValueBinding.m b/Source/NSKeyValueBinding.m index 460fe44f5..1ac303c52 100644 --- a/Source/NSKeyValueBinding.m +++ b/Source/NSKeyValueBinding.m @@ -141,9 +141,9 @@ void GSBindingInvokeAction(NSString *targetKey, NSString *argumentKey, { bindingLock = [GSLazyRecursiveLock new]; classTable = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, - NSOwnedPointerMapValueCallBacks, 128); - objectTable = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, - NSOwnedPointerMapValueCallBacks, 128); + NSObjectMapValueCallBacks, 128); + objectTable = NSCreateMapTable(NSNonRetainedObjectMapKeyCallBacks, + NSObjectMapValueCallBacks, 128); } } @@ -155,9 +155,9 @@ void GSBindingInvokeAction(NSString *targetKey, NSString *argumentKey, bindings = (NSMutableArray *)NSMapGet(classTable, (void*)clazz); if (bindings == nil) { - // Need to retain it ourselves bindings = [[NSMutableArray alloc] initWithCapacity: 5]; NSMapInsert(classTable, (void*)clazz, (void*)bindings); + RELEASE(bindings); } [bindings addObject: binding]; [bindingLock unlock]; @@ -249,13 +249,14 @@ void GSBindingInvokeAction(NSString *targetKey, NSString *argumentKey, list = (NSDictionary *)NSMapGet(objectTable, (void *)anObject); if (list != nil) { - enumerator = [list keyEnumerator]; + NSArray *keys = [list allKeys]; + + enumerator = [keys objectEnumerator]; while ((binding = [enumerator nextObject])) { [anObject unbind: binding]; } NSMapRemove(objectTable, (void *)anObject); - RELEASE(list); } [bindingLock unlock]; } @@ -297,6 +298,7 @@ void GSBindingInvokeAction(NSString *targetKey, NSString *argumentKey, { bindings = [NSMutableDictionary new]; NSMapInsert(objectTable, (void*)source, (void*)bindings); + RELEASE(bindings); } [bindings setObject: self forKey: name]; [bindingLock unlock];