美文网首页
KVO与KVC原理

KVO与KVC原理

作者: 分流替躺欧阳克 | 来源:发表于2019-06-01 16:55 被阅读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

    相关文章

      网友评论

          本文标题:KVO与KVC原理

          本文链接:https://www.haomeiwen.com/subject/ioeatctx.html