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;