iOS开发-KVO,KVC

 KVO的本质是什么?

 * 利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个子类

 * 当修改instance对象的属性时,会调用Function的_NSSetXXXValueAndNotify方法

 1.willChangeValueForKey:

 2.父类的setter方法

 3.didChangeValueForKey:

   1)内部会触发监听器(observer)的监听方法(observerValueForKeyPath:ofObject:change:context:)



 ## KVC的赋值取值原理是什么?

 * 常见的API

   1. 赋值

     1)- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

     2) - (void)setValue:(id)value forKey:(NSString *)key;

   2. 取值

      1)- (id)valueForKeyPath:(NSString *)keyPath;

      2)- (id)valueForKey:(NSString *)key;

 * setValue:forKey:的原理

   1. 先按照 setKey:、_setKey: 顺序查找方法

   2. 如果找到了方法,传递参数,调用方法

   3. 如果没有找到方法查看方法(accessInstanceVariablesDirectly)的返回值

      1)返回NO,调用方法(setValue:forUndefinedKey:)并抛出异常(NSUnknownKeyException)

      2)返回Yes,按照_key、_isKey、key、isKey顺序查找成员变量

      ① 找到成员变量直接赋值

      ② 未找到成员变量,调用方法(setValue:forUndefinedKey:)并抛出异常(NSUnknownKeyException)

 * valueForKey: 的原理

   1.先按照getKey、key、isKey、_key顺序查找方法

   2.如果找到方法,调用方法

   3. 如果没有找到方法查看(accessInstanceVariableDirectly)方法的返回值

      1)返回NO, 调用方法(valueForUndefinedKey:),并抛出异常NSUnknownKeyException

      2)返回Yes,按照_key、_isKey、key、isKey顺序查找成员变量

      ① 找到成员变量直接取值

        ② 未找到成员变量,调用(valueForUndefinedKey:)方法,并抛出异常NSUnknownKeyExcepyion

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容