KVC查找过程总结

1.setValueForKey

1.KVC取值查找的第一个方法getName

2.Object类中如果没有实现getName方法,KVC会查找第二个方法name

如果有getName方法,就不会继续往下查找了,因为getName方法已经生效了。

3.Object类中如果没有实现getName方法,也没有实现name方法,KVC会查找第三个方法isName

4.若前三个方法都没有实现,KVC会查找第四个方法_name

5.如果上述方法都没实现,接下来KVC会将要取的值看做数组,调用下面的方法:

    - (NSUInteger)countOfName(必须实现)

    以下两个二选一

    - (id)objectInNameAtIndex:(NSUInteger)index(优先查找)

    - (id)nameAtIndexes:(id)indexes(其次查找)

6.以上方法都没有找到,那么KVC会按照集合(NSSet)来处理,调用下面三个方法:

    - (NSUInteger)countOfName(必须实现)

    - (id)enumeratorOfName(必须实现)

    - (id)memberOfName:(id)name(必须实现)

7.方法查询到此为止,如果上述方法都没有查找到,接下来会按照顺序查找成员变量:

_name;_isName;name;isName;

8.如果上述方法和成员变量都没找到,KVC会走最后一步(id)valueForUndefinedKey:(NSString *)key,若次方法依然没有找到,程序崩溃。

2.valueForKey

1.KVC赋值查找的第一个方法setName:

2.如果setName:没有找到,KVC会查找第二个方法_setName:

3.如果前面两个方法都没有找到,接下来会调用(BOOL)accessInstanceVariablesDirectly,如果返回NO则不去查找成员变量,如果返回YES则接下来按照下列顺序规则查找成员变量。

_name;_isName;name;isName;

4.如果上述方法和成员变量都没找到,并且(BOOL)accessInstanceVariablesDirectly返回NO,KVC会走最后一步setValue:(id)value forUndefinedKey:(NSString *)key,若次方法依然没有找到,程序崩溃.

3.KVC

实例对象isa的指向在注册KVO观察者之后,由原有类更改为指向中间类

中间类重写了观察属性的setter方法、class、dealloc、_isKVOA方法

dealloc方法中,移除KVO观察者之后,实例对象isa指向由中间类更改为原有类

中间类从创建后,就一直存在内存中,不会被销毁

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

推荐阅读更多精彩内容

  • 一、自定义一个TestObject类,测试KVC取值的查询顺序 以下是TestObject的源码,你没看错,就是这...
    ChinaChong阅读 8,754评论 13 52
  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    朽木自雕也阅读 5,477评论 6 1
  • KVC(Key-valuecoding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS...
    榕樹頭阅读 3,989评论 0 2
  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    我的梦工厂阅读 4,342评论 1 8
  • KVC简称KeyValueCoding,是一个基于NSKeyValueCoding非正式协议的机制,可以允许开发者...
    不会写代码的尬先生阅读 1,417评论 0 1