kvc的原理本质

将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的错误。
    下面用一副图片来展示:


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


    kvc的原理本质_第2张图片
    image.png

你可能感兴趣的:(kvc的原理本质)