KVO
KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变,被监听的类会创建继承于被监听类的子类,然后将被监听类的isa指针指向子类,子类的方法比父类多了class
dealloc
isKVO
3个方法,在子类的set方法里会调用_NSSet*AndNotify
方法
_NSSet*AndNotify的内部实现
- 调用willChangeValueForKey:
- 调用原来的setter实现
- 调用didChangeValueForKey:
didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法
KVC
KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性
setValue:forKey:调用流程
- 按照setKey:、_setKey:
- 如果找不到setKey:、_setKey:方法,则查看accessInstanceVariablesDirectly方法的返回值(默认返回yes)
- 如果accessInstanceVariablesDirectly方法返回yes则按照_key、_isKey、key、isKey顺序查找成员变量,找到成员变量则赋值
- 如果accessInstanceVariablesDirectly方法返回no则调用setValue:forUndefinedKey:并抛出异常NSUnknownKeyException
valueForKey:调用流程
- 按照getKey、key、 isKey、_key顺序查找方法
- 如果没找打方法则查看accessInstanceVariablesDirectly方法的返回值(默认返回yes)
- 如果accessInstanceVariablesDirectly方法返回yes则按照_key、_isKey、key、isKey顺序查找成员变量
- 返回no调用valueForUndefinedKey:并抛出异常NSUnknownKeyException