KVC

2018-04-14  本文已影响0人  Gunks

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个成员变量

@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;
上一篇下一篇

猜你喜欢

热点阅读