KVC¶
NSKeyValueCoding
先找方法,再找成员变量。
属性本质:setter、getter、成员变量三部分。
set¶
- setKey
- _setKey
- setIsKey
- accessInstanceVariablesDirectly是否可以直接给成员变量赋值
- _key
- _isKey
- key
- isKey
- Exception程序崩溃
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
}
get¶
valueForKey调用顺序
- 先调用相关方法 先后顺序是:getKey -> key -> isKey->_key
如果实现了countOfKey
,objectInKeyAtIndex
这两个方法,key变成了NSKeyValueArray是NSArray子类,返回一个数组。
- 如果没有相关方法 就看accessInstanceVariablesDirectly 是否可以直接取实例变量 方法的返回值
- 返回NO 异常crash,报reason: valueForUndefinedKey:
- 返回YES就找成员变量,先后顺序是:_key -> _isKey -> key -> isKey,如果这四个成员变量都没有,则crash,报reason: valueForUndefinedKey:
- (id)valueForUndefinedKey:(NSString *)key
{
return nil;
}
KeyPath¶
//嵌套拿数据 里面是点语法 一直点下去 点分离key
id age = [p valueForKeyPath:@"dog.age"];//dog是p的属性
NSLog(@"狗的年龄是:%@",age);