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


    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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容