KVO&KVC

KVO

KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变,被监听的类会创建继承于被监听类的子类,然后将被监听类的isa指针指向子类,子类的方法比父类多了class dealloc isKVO3个方法,在子类的set方法里会调用_NSSet*AndNotify方法
_NSSet*AndNotify的内部实现

  1. 调用willChangeValueForKey:
  2. 调用原来的setter实现
  3. 调用didChangeValueForKey:

didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法

KVC

KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性

setValue:forKey:调用流程
  1. 按照setKey:、_setKey:
  2. 如果找不到setKey:、_setKey:方法,则查看accessInstanceVariablesDirectly方法的返回值(默认返回yes)
  3. 如果accessInstanceVariablesDirectly方法返回yes则按照_key、_isKey、key、isKey顺序查找成员变量,找到成员变量则赋值
  4. 如果accessInstanceVariablesDirectly方法返回no则调用setValue:forUndefinedKey:并抛出异常NSUnknownKeyException
valueForKey:调用流程
  1. 按照getKey、key、 isKey、_key顺序查找方法
  2. 如果没找打方法则查看accessInstanceVariablesDirectly方法的返回值(默认返回yes)
  3. 如果accessInstanceVariablesDirectly方法返回yes则按照_key、_isKey、key、isKey顺序查找成员变量
  4. 返回no调用valueForUndefinedKey:并抛出异常NSUnknownKeyException

你可能感兴趣的:(KVO&KVC)