Key Value Monitoring a key in an NSMutableDictionary that contains dots?

I would like to use KVO to watch for changes in the value of NSMutableDictionary. However, I found that it does not work, because the key in the dictionary that I would like to observe contains dots.

What is the correct way to add an observer for a key path containing points?

For example, resolving this issue works fine:

@interface Foo : NSObject @end
@implementation Foo

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSLog(@"observing: -[%@ %@]", object, keyPath);
    NSLog(@"change: %@", change);
}

@end

int main (int argc, const char * argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Foo * f = [[Foo alloc] init];

    NSMutableDictionary * d = [NSMutableDictionary dictionary];
    [d addObserver:f forKeyPath:@"foo" options:0 context:NULL];
    [d setObject:@"bar" forKey:@"foo"];
    [d removeObjectForKey:@"foo"];
    [d removeObserver:f forKeyPath:@"foo"];
    [f release];

    [pool drain];
    return 0;
}

However, this does not work:

@interface Foo : NSObject @end
@implementation Foo

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSLog(@"observing: -[%@ %@]", object, keyPath);
    NSLog(@"change: %@", change);
}

@end

int main (int argc, const char * argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Foo * f = [[Foo alloc] init];

    NSMutableDictionary * d = [NSMutableDictionary dictionary];
    [d addObserver:f forKeyPath:@"com.company.foo" options:0 context:NULL];
    [d setObject:@"bar" forKey:@"com.company.foo"];
    [d removeObjectForKey:@"com.company.foo"];
    [d removeObserver:f forKeyPath:@"com.company.foo"];
    [f release];

    [pool drain];
    return 0;
}
+3
source share
1 answer

NSDictionary KVO, , , . , - /-.

0

All Articles