KVC

作者: Berning | 来源:发表于2021-02-27 16:16 被阅读0次

KVC基本使用

  NSCat *cat = [NSCat new];  
  NSPerson *person = [NSPerson new];  
  person.cat =cat;
  [person setValue:@10 forKey:@"age"];
  [person valueForKey:@"age"];
  [person setValue:@"mimi" forKeyPath:@"cat.name"];
  [person valueForKey:@"cat.name"];

KVC赋值

  • 按照setKey: -> _setKey ->的顺序查找方法,
    如果上述方法不存在,判断+accessInstanceVariablesDirectly的返回值
  • if(NSPerson. accessInstanceVariablesDirectly == NO)

//抛出

exception 'NSUnknownKeyException', 
reason: '[<NSPerson 0x1005acc70> setValue:forUndefinedKey:]:this class is
 not key value coding-compliant for the key age.'
  • if (NSPerson. accessInstanceVariablesDirectly == YES)
    按照_key-> _isKey ->key -> isKey 的顺序查找成员变量赋值
    如果上述成员变量都不存在,抛出
exception 'NSUnknownKeyException', 
reason: '[<NSPerson 0x1005acc70> setValue:forUndefinedKey:]:this class is
 not key value coding-compliant for the key age.'

KVC取值

按照- getKey -> key ->isKey->_key的顺序查找方法,
如果上述方法不存在,判断+accessInstanceVariablesDirectly的返回值

  • if(NSPerson. accessInstanceVariablesDirectly == NO)

//抛出

exception 'NSUnknownKeyException', 
reason: '[<NSPerson 0x1005acc70> valueForUndefinedKey:]:this class is
 not key value coding-compliant for the key age.'
  • if(NSPerson. accessInstanceVariablesDirectly == YES)
    按照_key-> _isKey ->key -> isKey 的顺序查找成员变量赋值
    如果上述成员变量都不存在,抛出
exception 'NSUnknownKeyException', 
reason: '[<NSPerson 0x1005acc70> setValue:forUndefinedKey:]:this class is
 not key value coding-compliant for the key age.'

KVC触发KVO

  • 存在setKey:方法,会触发KVO
  • 不存在setKey:方法,也会触发KVO(相当于手动触发KVO
//伪代码
- (void)setValue:(id)value forKey:(NSString *)key
{
    [self willChangeValueForKey:key];
   
    Method method = class_getInstanceMethod(self.class,@selector(setKey:));
    IMP imp = method_getImplementation(method);
    
    Method _method = class_getInstanceMethod(self.class,@selector(setKey:));
    IMP _imp = method_getImplementation(method);

    if (imp != NULL) {
//        [self setKey:key];
    }
    else if (_imp != NULL)
    {
//        [self _setKey:key];

    }
    else if(self.class.accessInstanceVariablesDirectly == YES)
    {
//        if(_key)
//        {}
//        else if(_iskey)
//        {}
//        else if(key)
//        {}
//        else
//        {}
    }
    else
    {
        @throw @"NSUnknownKeyException,reason:setValue:forUndefinedKey";
    }

    
    [self willChangeValueForKey:key];
}

相关文章

  • KVC详解

    KVC 目录结构KVC定义KVC取值和设置KVC使用keyPathKVC处理字典KVC作用 参考:iOS KVC和...

  • iOS原理篇(二): KVC实现原理

    KVC实现原理 什么是 KVC KVC基本使用 KVC 原理 总结 一 、 什么是KVC KVC的全称是Key-V...

  • iOS 关于KVC的一些总结

    本文参考: KVC官方文档 KVC原理剖析 iOS KVC详解 KVC 简介 KVC全称是Key Value Co...

  • KVC,KVO

    KVC , KVO KVC和KVO的区别及应用 KVC/KVO原理 1. KVC键值编码 KVC,即是指NSKey...

  • iOS 关于KVC的一些总结(转)

    原文:iOS 关于KVC的一些总结 本文参考: KVC官方文档 KVC原理剖析 iOS KVC详解 KVC 简介 ...

  • OC语法:KVC的底层实现

    一、KVC是什么二、怎么使用KVC三、KVC的底层实现四、KVC常见面试题 一、KVC是什么 KVC全称Key-V...

  • 19.iOS底层学习之iOS底层学习之KVC

    本篇提纲1、KVC的基本介绍2、KVC的API3、KVC的写入过程4、KVC的读取过程5、自定义KVC KVC的基...

  • iOS【KVC&KVO】

    kvc 1. KVC 1.1 KVC概念 KVC全称是Key Value Coding,定义在NSKeyValue...

  • ios开发UI篇—Kvc简单介绍

    一、KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC...

  • KVC的简单使用

    KVC字典转模型 KVC 中经常使用的就是字典转模型 KVC的大招 KVC设置对象属性及取值 KVC间接设置对象属...

网友评论

      本文标题:KVC

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