KVO与KVC原理

2019-06-01  本文已影响0人  分流替躺欧阳克

KVO

1:实现原理

对实例对象属性监听,会利用runtime动态生成一个类NSKVONotifying_Class.并且生成三个方法

1):-(void)Class; 2)isKVO; 3)dealloc;

重写监听的属性方法 –(void)setProperty;

2:监听流程:

调用新生成的类里的set属性方法,然后调用Foundation框架的_NSSetIntValueAndNottify();

这个方法里会调用三个方法

[self willChangeValueForKey:key];

[super setProperty:value]

[self didChangeValueForKey:key];

在didChangeValueForKey里会调用

[observe observeValueForKeyPath:key ofObject:self change:change context:context];

3:验证部分:

1): 调用方法验证

_NSSetIntValueAndNottify()

这个方法会调用的证明过程:

对类的属性监听后,

[self.instance methodForSelector:@selector(setProperty:)]

会返回方法地址,然后利用p (IMP)+方法地址,控制台会输出调用的函数名,就是_NSSetIntValueAndNottify();系列方法;

2):生成方法验证

unsigned int count;

Method*methodList=class_copy MethodList(cls,&count);

NSMutableString*methodNames=[NSMutableString string];

For(int i=0;i<count:i++)

{

           Method method = MethodList[I];

NSString*method=NSStringFromSelector(method_getName(thod));

          [methodNames appendString:methodName];

[methodNames appendString:@","];

}                                                                  

free(methodList);

NSLog(@"%@  %@",cls,methodNames);

打印出方法可以看到四个方法,其中有一个是原本类就有set方法.

KVC

1 赋值流程:setValue:forKey:

  1. 按照setKey: _setKey顺序查找方法,找到则传递参数.

  2. 找不到则查看accessInstanceVariablesDirectly方法返回值,若是YES则允许访问成员变量,按照_key,_isKey,key,isKey顺序查找成员变量.

  3. 找到了就直接赋值。找不到就调用setValue:forUndefinekey: 并抛出异常NSUnknownKeyException**

2 取值流程:valueForKey

  1. 按照getKey、key、isKey、_key顺序查找方法。找到则调用.

  2. 找不到则查看accessInstanceVariablesDirectiy返回值,若YES则允许访问成员变量,按顺序_key、_isKey、key、isKey查找成员变量,找到直接取值.

  3. 找不到成员变量则调用valueForUndefinedKey:并抛出异常NSUnknownKeyException

上一篇下一篇

猜你喜欢

热点阅读