kvc的原理本质

作者: 目前运行时 | 来源:发表于2018-07-06 11:24 被阅读13次

    将oc的代码转换成c或者c++代码的命令(比如我转换的main.m文件)
    首先切换到main.m所在的文件位置,然后执行这段命令:

    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m
    

    如果代码中有__weak
    执行这段命令

    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m
    
    • kvc的作用:实现对象属性值的变化,一般来说就是获取或者改变。
    • kvc的简单使用:
        DGPerson *person = [[DGPerson alloc] init];
    //    person->_age = 10;
    //    person ->_isAge = 30;
        [person setValue:@10 forKey:@"age"];
    
    • kvc 付值的整个过程:
      1.先会调用setKey:这个方法。
      2.如果1没有的话开始调用_setKey:这个方法。
      3.如果2的方法也没有开始判断这个方法(+ (BOOL)accessInstanceVariablesDirectly)返回的是yes还是no,如果是yes则继续发现是否有这些成员变量(_key,_isKey,key,isKey)按照顺序执行的,如果都没有报找不到那个key的错误,如果返回的是no,直接报找不到key的错误。
      下面用一副图片来展示:


      image.png
    • kvc获取值的原理:
      1.先去找getKey这个方法
      2.如果1找不到,找key这个方法
      3.如果2找不到,找isKey这个方法
      4.如果3找不到,找_key这个方法。
      5.如果以上的方法都找不到,先判断这个方法(+ (BOOL)accessInstanceVariablesDirectly)是否是真,如果是真,则继续找这些成员变量,注意按照顺序查找(_key,_isKey,key,isKey)查找,如果都找不到,报方法找不到的错误,如果找到了获得值,如果这个方法(+ (BOOL)accessInstanceVariablesDirectly)为假,那就直接报方法找不到的错误。下面是流程图:


      image.png

    相关文章

      网友评论

        本文标题:kvc的原理本质

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