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指向由中间类更改为原有类
中间类从创建后,就一直存在内存中,不会被销毁