美文网首页
iOS-KVC的使用和原理

iOS-KVC的使用和原理

作者: Arthur澪 | 来源:发表于2020-03-12 09:57 被阅读0次

    简介

    KVC(Key Value Coding) 是一种可以通过key来访问类属性的机制。而不是通过调用Setter、Getter方法访问。可以在运行时动态访问和修改对象的属性。
    KVC的方法定义在Foundation/NSKeyValueCoding中。

    提供了常用的方法:

    -(void)setValue:(id)value forKeyPath:(NSString *)keyPath;
    -(void)setValue:(id)value forKey:(NSString *)key;
    -(id)valueForKeyPath:(NSString *)keyPath;
    -(id)valueForKey:(NSString *)key;
    

    使用1:
    假如name是自定义Person类的一个属性,使用KVC。

    // 赋值
    [person1 setValue:@"jack" forKey:@"name"];
    // 取值
    NSString *name = [person1 valueForKey:@"name"];
    

    使用2:
    forKeyPath 是对更“深层”的对象进行访问。如数组的某个元素,对象的某个属性。如:

    [myModel setValue:@"beijing" forKeyPath:@"address.city"];
    
    // 返回所有对象的name属性值
    NSArray *names = [array valueForKeyPath:@"name"];
    

    KVC和KVO都属于键值编程,而且底层实现机制都是isa-swizzing

    底层原理

    • setValue:forKey:

    1.按setKey:、_setKey:的顺序查找方法,找到了就传递参数,调用方法。
    2.如果没找到,查看accessInstanceVariablesDirectly方法的返回值,返回NO 则调用setValue:forUndefinedKey:并抛出异常 NSUnknownKeyException

    方法accessInstanceVariablesDirectly默认返回的是YES

    3.如果返回 YES 按照_key、_isKey、key、isKey的顺序查找成员变量,找到了就直接赋值。
    4.如果没找到,就调用setValue:forUndefinedKey:并抛出异常NSUnknownKeyException


    • valueForKey:

    1.按照getKey、key、isKey、_key的顺序查找方法,找到了就直接调用。
    2.如果没找到,就查看accessInstanceVariablesDirectly方法的返回值,返回NO则 调用valueForUndefinedKey:并抛出异常NSUnknownKeyException
    3.如果返回 YES按照_key、_isKey、key、isKey的顺序查找成员变量。找到了就直接取值。
    4.如果 没有查找到,就调用valueForUndefinedKey:并抛出异常NSUnknownKeyException

    相关文章

      网友评论

          本文标题:iOS-KVC的使用和原理

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