美文网首页
KVC(NSKeyValueCoding):

KVC(NSKeyValueCoding):

作者: nalis风 | 来源:发表于2016-07-19 02:42 被阅读17次

    setValue:属性值 forKey:属性名: 为指定属性设置值

    valueForKey:属性名: 获取指定属性的值

    [p setValue:@"小麦" forKey:@"_name"];

    NSLog(@"%@",p.name);

    KVC setValue: forKey: 执行机制:

    1.优先考虑调用“setName:属性值;” 代码通过setter 方法完成设置

    2.如果没有setName KVC搜索该类名为_name的成员变量,无论该成员变量实在类接口部分定义,还是在类实现部分定义,也无论用哪个访问控制符修饰,这条KVC代码底层实际上就是对_name成员变量赋值

    3.若1 2 皆无 搜索名为name,无论该成员变量实在类接口部分定义,还是在类实现部分定义,也无论用哪个访问控制符修饰,这条KVC代码底层实际上就是对name成员变量赋值

    4.1 2 3 都没有找到 执行该对象的setValue:forUndefinedKey:,此方法的默认执行是为了引发一个称为 NSUnknownKeyException的异常

    valueforKey@"name"底层执行机制:

    1.优先getter方法

    2.否则搜索类名为_name的成员变量,如set...般不考虑权限

    3.否则搜索name

    4.否则执行valueforUndefinedKey:方法

    NSUnknownKeyException方法的重写,不需要声明。//设置部分

    -(void) setValue:(id) value forUnderfinedKey: (id) Key{

    //自定义语句

    }

    -(void)valueForUndefinedKey:(id)key{

    //自定义语句

    }

    OC中并不存在绝对隐藏的方法,既是一个方法仅仅在类实现部分定义,类接口部分没有定义,也可通过NSObject提供的performSelector:或 performSelector:withObject:方法调用。

    KVC处理nil值:

    int 等类型无法接受nil 可以重写setNilValueForKey:方法

    -(void) setNilValueForKey:(id)key

    {

    //自定义语句

    [super setNulValueForKey: key];

    }

    Key路径:

    除了操作对象的属性之外,还可操作对象的"符合属性"  所谓“复合属性“,KVC机制将其称为Key路径,比如

    为实例提供直接操作类属性成员变量中的成员变量

    setValue:forKeyPath: 根据Key路径设置属性名

    valueForKeyPath: 根据Key路径获取属性值 设置复合属性时,需要用到ForKeyPath而不是ForKeyPath

    [u setValue:[[FKPreson alloc] init] forKey:@"p"];//使用的时候要把类对象初始化

    [u setValue:@"小麦" forKeyPath:@"p.name"];

    NSLog(@"%@",[u valueForKeyPath:@"p.name"]);

    性能比setter getter差,但是灵活性高。

    相关文章

      网友评论

          本文标题:KVC(NSKeyValueCoding):

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