title: why the setter of var for KVO crashed (swift 2.2)?
body: <p>I'm using KVO for manual notifications, but why the code crashed for the reason:</p>
  
  <blockquote>
    <p>Thread 1:EXC_BAD_ACCESS (code=2, address=0x7fff577bcfa8)" when click
    run?</p>
  </blockquote>
  
  <p>Please see below the codes:  </p>
  
  <p><code>ChildrenViewController.swift</code> (class to be observed)</p>
  
  <pre><code>import UIKit
  class ChildrenViewController: UIViewController {
  
  dynamic var name: String? {
      get {
          return ""
      }
  
      set {
          willChangeValueForKey("name")
          guard let value = newValue else {return}
          self.setValue(value, forKey: "name") //crashed here!SAID "Thread 1:EXC_BAD_ACCESS (code=2, address=0x7fff577bcfa8)"
          didChangeValueForKey("name")
      }
  
  }
  
  dynamic var age = 0
  
  var child: ChildrenViewController?
  
  override class func automaticallyNotifiesObserversForKey(key: String) -&gt; Bool {
      if key == "name" {
          return false
      }
      return super.automaticallyNotifiesObserversForKey(key)
  }
  
  }
  </code></pre>
  
  <p><code>ViewController.swift</code> (the observer)</p>
  
  <pre><code>import UIKit
  
  private var child1Context = 1
  
  class ViewController: UIViewController {
  
  var child1 = ChildrenViewController()
  
  override func viewDidLoad() {
      super.viewDidLoad()
  
      self.child1.setValue("George", forKey: "name")
      self.child1.setValue(15, forKey: "age")
  }
  
  override func viewWillAppear(animated: Bool) {
      super.viewWillAppear(animated)
  
      child1.addObserver(self, forKeyPath: "name", options: [.New,.Old], context: &amp;child1Context)
      child1.addObserver(self, forKeyPath: "age", options: [.New, .Old], context: &amp;child1Context)
  
      self.child1.name = "Michael" //set the name String
      self.child1.setValue(20, forKey: "age")
  }
  
  override func viewWillDisappear(animated: Bool) {
      super.viewWillDisappear(animated)
  
      self.child1.removeObserver(self, forKeyPath: "name")
      self.child1.removeObserver(self, forKeyPath: "age")
  }
  
  override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer&lt;Void&gt;) {
      if context == &amp;child1Context {
          if keyPath == "name" {
              print("The name of FIRST has been changed, \(change)")
          }
          if keyPath == "age" {
              print("The age of FIRST has been changed, \(change)")
          }
      }               
      }
  
  }
  </code></pre>