iOS-KVC(键指编码)

作者: 良人不归_墨染锦年 | 来源:发表于2018-05-13 15:05 被阅读226次

    KVC的全称是Key Value Coding,即键值编码,由NSKeyValueCoding协议提供支持,最基本操作属性的方法有以下两个

    //setValue为属性值  forKey为属性名(指定属性设置值)
    [person setValue:@"孙悟空"  forKey:@"name"];
    //valueForKey为属性名(获取指定属性的值)
    [person valueForKey:@"name"];
    

    setValue: forKey:的执行机制

    [person setValue:@"孙悟空"  forKey:@"name"];
    

    1.会优先调用setName:方法,通过setter方法完成设置。
    2.如果该类没有setName:方法,那么KVC该类中会搜索名字为_name的成员变量,无论_name是在类接口部分或实现部分定义,KVC都会对_name进行赋值。
    3.如果以上两个都没有,那么KVC会搜索该类中名为name的成员变量,无论name是在类接口部分或实现部分定义,KVC都会对name进行赋值。
    4.如果以上都没找到,系统会执行该对象的setValue:forUndefinedKey:方法。

    valueForKey:的执行机制

    [person valueForKey:@"name"];
    

    1.会优先调用name:方法,通过getter方法的返回值。
    2.如果该类没有setName:方法,那么KVC该类中会搜索名字为_name的成员变量,无论_name是在类接口部分或实现部分定义,KVC都会对_name进行赋值。
    3.如果以上两个都没有,那么KVC会搜索该类中名为name的成员变量,无论name是在类接口部分或实现部分定义,KVC都会对name进行赋值。
    4.如果以上都没找到,系统会执行该对象的valueForUndefinedKey:方法。

    注意:setValue:forUndefinedKey:和valueForUndefinedKey:方法实现就是引发一个异常,这个异常将会导致程序应为异常结束,如果需要避免这种情况,需要在类中重写这两个方法即可。

    key路径

    KVC除了可操作对象的属性之外,还可以操作对象的复合属性,复合属性是指,比如,Person对象包含了一个Man类型的man属性,而Man对象又包含了name属性,那么KVC可以通过man.name这种key路径来操作Person对象的man属性的name属性。

    [person setValue:@"孙悟空"  forKey:@"man.name"];
    [person valueForKey:@"man .name"];
    

    KVC和setter、getter方法比较

    其实用KVC操作对象属性的性能比通过setter和getter方法操作的性能更差,使用KVC的优势在于灵活,适用于提炼一些通用的代码。

    相关文章

      网友评论

        本文标题:iOS-KVC(键指编码)

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