Why does NSOperation disable automatic key-value observing?
When working with a custom `NSOperation` subclass I noticed that the automatic key-value observing is disabled by the `automaticallyNotifiesObserversForKey` class method (which returns `NO` at least for some key paths). Because of that the code inside of `NSOperation` subclasses is littered by manual calls to `willChangeValueForKey:` and `didChange…`, as visible in many code samples on the web.

Why does `NSOperation` do that? With automatic KVO support people could simply declare properties for the operation lifecycle flags (`isExecuting` etc.) and trigger the KVO events through the accessors, ie. the following code:

    [self willChangeValueForKey:@"isExecuting"];
    executing = NO;
    [self didChangeValueForKey:@"isExecuting"];
    [self willChangeValueForKey:@"isFinished"];
    finished = YES;
    [self didChangeValueForKey:@"isFinished"];

…could be replaced by this:

    [self setIsExecuting:NO];
    [self setIsFinished:YES];

Is there a catch somewhere? I just overrode the `automaticallyNotifiesObserversForKey` to return `YES` and things seem to work fine.
Why does NSOperation disable automatic key-value observing?
===

When working with a custom `NSOperation` subclass I noticed that the automatic key-value observing is disabled by the `automaticallyNotifiesObserversForKey` class method (which returns `NO` at least for some key paths). Because of that the code inside of `NSOperation` subclasses is littered by manual calls to `willChangeValueForKey:` and `didChange…`, as visible in many code samples on the web.

Why does `NSOperation` do that? With automatic KVO support people could simply declare properties for the operation lifecycle flags (`isExecuting` etc.) and trigger the KVO events through the accessors, ie. the following code:

    [self willChangeValueForKey:@"isExecuting"];
    executing = NO;
    [self didChangeValueForKey:@"isExecuting"];
    [self willChangeValueForKey:@"isFinished"];
    finished = YES;
    [self didChangeValueForKey:@"isFinished"];

…could be replaced by this:

    [self setIsExecuting:NO];
    [self setIsFinished:YES];

Is there a catch somewhere? I just overrode the `automaticallyNotifiesObserversForKey` to return `YES` and things seem to work fine.