KVO problems with CALayer on 10.5?

December 13, 2009

I was trying out some code on 10.5 that was originally developed on 10.6, and ran into a number of really strange issues. At first they seemed almost random and unrelated but after debugging for a while it turned out they were all related to key-value observation in some way or another.

After more debugging, it became clear that for some reason I was not getting any observer callbacks and Cocoa bindings weren't working for certain objects.

This looked suspicious, and sure enough, implementing:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
    BOOL notifies = [super automaticallyNotifiesObserversForKey:key];
    NSLog(@"Notifies for key %@: %d", key, notifies);
    return notifies;
}

in one of the affected classes showed that the return value was always NO, even for properties that I had declared myself!

The reason is that CALayer's implementation of automaticallyNotifiesObserversForKey: in 10.5 returns NO for all keys. In 10.6 it works as expected, returning only NO for its own properties.

Fortunately the work-around is simple: just implement the class method yourself and return YES for your own properties:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
    if ([key isEqualToString:@"myKey"]) {
        return YES;
    }

    return [super automaticallyNotifiesObserversForKey:key];
}