KVC底层实现

一、关于 valueForKey:key 的调用顺序

1、 先调用相关方法,先后顺序是

|- getter 方法:getKey -> key -> isKey
|- NSArray 方法:countOfKey 和 objectInKeyAtIndex 或者 keyAtIndexes
|- NSSet 方法:countOfKey 和 其他两种方法

2、 如果没有相关方法,看 + (BOOL)accessInstanceVariablesDirectly 返回值!

|- YES 找成员变量,先后顺序:_key -> _isKey -> key -> isKey
|- NO & 以上找不到 异常 valueForUndefinedKey:

二、关于 setValue: forKey:key 的调用顺序

1、 先调用相关方法,先后顺序是

|- setter 方法:setKey -> setIskey

2、 如果没有相关方法,看 + (BOOL)accessInstanceVariablesDirectly 返回值!

|- YES 找成员变量,先后顺序:_key -> _isKey -> key -> isKey
|- NO & 以上找不到 异常 setValue: forUndefinedKey:

三、封装基类,需要对 setValue:forKey: 和 valueForKey: 方法的异常做处理,程序才健壮

- (id)valueForUndefinedKey:(NSString *)key
{
    return nil;
}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    NSLog(@"Undefine");
}

- (void)setNilValueForKey:(NSString *)key
{
    
}

你可能感兴趣的:(KVC底层实现)