KVC

作者: Gunks | 来源:发表于2018-04-14 17:17 被阅读0次

    1.关于KVC setValue: forKey: 的调用顺序

        [p setValue:@"20" forKey:@"age"];
    

    先找两个set方法

    首先会访问该类的setage方法,其次setisage方法    ~~**优先级前者更高**~~
    这两个方法没有会去找accessInstanceVariablesDirectly方法
        如果返回YES,会去找4个成员变量的setter方法
        如果返回NO,就不会去找成员变量
        最后一个保险会去找setvalue:forUndefinedKey:这个方法
        如果有就执行这个方法里面的代码
        再没有那就会抛出异常了
    

    2.关于KVC valueForKey:key 的调用顺序

    - 先调用相关方法,先后顺序是
        - getter方法:getKey(Key首字母大写)  -> key -> isKey
        - NSArray方法:countOfName 和objectInNameAtIndex 方法
    - 如果没有相关方法: 看+(BOOL)accessInstanceVariablesDirectly 返回值
        - 返回值是YES 先后顺序 _key ->_isKey ->key ->isKey
        - No valueForUndefinedKey:key 重写该方法
            - 最后抛出异常
    

    3.如何让KVC不去找成员变量?

    //通知KVC不访问我的成员变量
    +(BOOL)accessInstanceVariablesDirectly{
        return NO;
    }
    

    将该类的accessInstanceVariablesDirectly的返回值设置成NO就不会去找成员变量了

    • 如果这两个方法都没有,会去找该类的成员变量


    一共会去找4个成员变量

    • 优先级
      _age > _isAge > age > isAge
    @interface Person : NSObject
    {
        NSString * _age;
        NSString * _isAge;
        NSString * age;
        NSString * isAge;
    }
    

    如果有就匹配,没有就会报错了


    属性的本质:setter getter 成员变量


    属性有3个get方法

    -(NSString *)name{
        return @"Gunks";
    }
    
    -(NSString *)getName{
        return @"getGunks";
    }
    
    -(NSString *)isName{
        return @"isGunks";
    }
    




    注:

    @property(nonatomic,assign) int age;
    
        Person * p = [[Person alloc]init];
        [p setValue:nil forKey:@"age"];
    

    这种情况会提示

    could not set nil as the value for the key age
    

    解决方案

    - (void)setNilValueForKey:(NSString *)key{
        NSLog(@"不能将%@设置为空",key);
    }
    
     NSException *exception = [NSException exceptionWithName:@"ZXKVO exception" reason:@"must be NSObject type" userInfo:nil];
        @throw exception;
    

    相关文章

      网友评论

          本文标题:KVC

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