1.API
//给属性设置值
[objc setValue:@10 forKey:@"age"]; //只作用于属性
[objc setValue:@10 forKeyPath:@"age"]; //可作用于属性的属性
//取属性值
[objc valueForKey:@"age"];
[objc valueForKeyPath:@"age"];
//kvc可以触发kvo
2.setValue: forKey:原理
1.查找setKey: ,再查找_setKey: ,如果有则直接调用,没有则第2步
2.调用+ (BOOL)accessInstanceVariablesDirectly,如果该方法返回No,则抛出异常NSUnknownKeyException.如果该方法返回yes,则3
3.查找成员变量_key,_isKey,key,isKey ,哪个先找到,就复制。如果都没有,则抛出异常NSUnknownKeyException.
3.getValueforKey:原理
1.按照getKey,key,isKey,_key
2.如果1的方法都没有,调用+ (BOOL)accessInstanceVariablesDirectly,如果该方法返回No,则抛出异常NSUnknownKeyException.如果该方法返回yes,则3
3.查找成员变量_key,_isKey,key,isKey ,哪个先找到,就取值。如果都没有,则抛出异常NSUnknownKeyException.
网友评论