iOS 对KVC底层实现的理解

s大家从网上的资料也可以查找出对KVC的描述。那我也就站在前人的基础上做一个小小的偷懒,复制一段网上的资料。

KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位的。isa指针,如其名称所指,(就是is a kind of的意思),指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。

比如说如下的一行KVC的代码:

[site setValue:@"sitename"forKey:@"name"];

就会被编译器处理成:

SEL sel = sel_get_uid ("setValue:forKey:");

IMPmethod = objc_msg_lookup (site->isa,sel);

method(site, sel, @"sitename",@"name");

IPM注释:

其实,还有一种更加简单的方法可以让我们办到相同的目的,运用IMP指针,IMP就是Implementation的缩写,顾名思义,它是指向一个方法实现的指针,每一个方法都有一个对应的IMP,所以,我们可以直接调用方法的IMP指针,来避免方法调用死循环的问题。

看了上一段大家KVC有个初步的认识,那下面就具体结合实际中应用来进行分析。

在.h文件中的申明

iOS 对KVC底层实现的理解_第1张图片

下面是字典转模型

iOS 对KVC底层实现的理解_第2张图片

以上代码就是一个简单字典转模型的写法。在这里要注意的就.h里的属性声明名称必须和字典里的Key保持一致,这是问什么了如果不一致的话就会报错。我对KVC底层理解就从这句话开始的。

首先要考虑的就是我们在使用setValuesForKeysWithDictionary:这个方法,这个方法的底层是调用setValue:forKey:,到了这里我们就一下子回到上面红色的那一大部分。(这里的Value和Key都可以通过字典转数组在遍历数组来获取。

iOS 对KVC底层实现的理解_第3张图片

)但到了这一步问题还是没有解决,那么我们就往下面走。上面红色部分为我们提供一个访问路径,告诉内这块是谁的(好比如一个标记)它并没有告述我们最想要的答案。那在这里我只能做一个它的底层实现推测。

method(site,sel, @"sitename", @"name");到了这一步后我们的路径已经确定,我认为他下边有类似我们的set和get这样的方法(这种想法是起源与属性set和get方法的使用),这个方法的名称就是key『name』,等等到了这里是我们是不是感觉这样的东西很熟悉,那就是我们类中声明的属性也有这样的方法,这两者类的isa相同的那它有必要建两个吗我认为method(site,sel, @"sitename", @"name");是会与属性的set和get会产生一个连接。到了这里是不是思路打开了。上面的报错也可以解决了因为key写错或字典中的数据过多的报错都是没有办法取得关联。

你可能感兴趣的:(iOS 对KVC底层实现的理解)