title: when to use KVO?
body: <p>I have read many docs on KVO, but I'm still confused as to when to use it.</p>
  
  <p>In case <code>objA</code> wants to monitor a certain property of <code>objB</code>, like so:</p>
  
  <pre><code>self.objB = [[ObjB alloc] init];
  [self.objB addObserver:self
              forKeyPath:@"address"
                 options:0
                 context:nil];
  </code></pre>
  
  <p>so if <code>objB</code>'s property changes, and it can only be changed by <code>self</code>, why not just do this:</p>
  
  <pre><code>self.objB.property = @"newValue";
  [self doSomethingBasedOnNewValueOfObjBnewProperty];
  </code></pre>
  
  <p>instead of </p>
  
  <pre><code>- (void)observeValueForKeyPath:(NSString *)keyPath
                        ofObject:(id)object
                          change:(NSDictionary *)change
                         context:(void *)context
  
  {
      if(keyPath == @"address") {
          [self doSomethingBasedOnNewValueOfObjBnewProperty];
      }
  }
  </code></pre>
  
  <p>It may be useful when used with a singleton, like <code>self.objB = [ObjB sharedInstance]</code>, where properties may be changed by other objects. Is this the only use case?</p>