Most KVO and KVC functionality is already implemented by default on all NSObject subclasses.
To start observing a property named firstName of an object named personObject do this in the observing class:
[personObject addObserver:self
               forKeyPath:@"firstName"
                  options:NSKeyValueObservingOptionNew
                  context:nil];
The object that self in the above code refers to will then receive a observeValueForKeyPath:ofObject:change:context: message whenever the observed key path changes.
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary<NSString *,id> *)change
                       context:(void *)context
{
    NSLog(@"new value of %@ is: %@", keyPath, change[NSKeyValueChangeNewKey]);
}
"Key path" is a KVC term. NSObject subclasses implement KVC functionality by default.
An instance variable named _firstName will be accessible by the @"firstName" key path.
A getter method named firstName will be called when accessing the @"firstName" key path, regardless of there being a _firstName instance variable or setFirstName setter method.
 
                