KVC主要通过isa
来实现其内部查找定位的。默认的实现方法由NSOject
提供isa
指针, 如其名称所指,(就是is a kind of
的意思), 指向分发表对象的类. 该分发表实际上包含了指向实现类中的方法的指针, 和其它数据。
具体主要分为三大步
- 第一步:寻找该属性有没有setsetter方法?有,就直接赋值
- 第二步:寻找有没有该属性带下划线的成员属性?有,就直接赋值
- 第三步:寻找有没有该属性的成员属性?有,就直接赋值
或者这么说:
- 1.首先搜索
setKey:
方法.(key
指成员变量名, 首字母大写) - 2.上面的
setter
方法没找到, 如果类方法accessInstanceVariablesDirectly
返回YES
. 那么按_key
,_isKey
,key
,iskey
的顺序搜索成员名.(NSKeyValueCodingCatogery
中实现的类方法, 默认实现为返回YES
) - 3.如果没有找到成员变量, 调用
setValue:forUnderfinedKey:
[object setValue:@"13123" forKey:@"uuid"];
就会被编译器处理成:
// 1.首先找到对应sel
SEL sel = sel_get_ uuid("setValue:forKey:");
// 2.根据object->isa找到sel对应的IMP实现指针
IMP method = objc_msg_lookup (object->isa,sel);
// 3.调用指针完成KVC赋值
method(object, sel, @"13123", @"uuid");
网友评论