1.KVC是什么?
KVC是key-value-coding.可以根据key值去直接访问和修改对象的属性值,包括私有属性的值。
2.readonly的属性可以修改吗?
可以
- [object setvalue:value forkeypath:@"key"]方法查找顺序是怎么样的?
- 按照setKey、_setKey、setIsKey的顺序去找setter方法。
- 没找到的话,调用accessInstanceVariablesDirectly 方法,返回YES的话,按照_key、_isKey、key、isKey查找成员变量。
- 如果返回NO,进入- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法,进行处理。
- 没有实现这个方法,直接抛出异常。
- [object valueForKey:@"key"]取值时,方法查找顺序是什么样的?
- 按照getKey:、key、isKey的顺序查找getter方法。
- 如果没有找到三个方法中的任意一个,那么进入+ (BOOL)accessInstanceVariablesDirectly方法判断是否允许取成员变量的值
- 返回yes的话,按照_key、_isKey、 key、isKey去取对应成员变量的值。
- 还是没有找到的话,调用- (nullable id)valueForUndefinedKey:(NSString *)key方法
- 如果这个方法没有实现的话,就抛出异常。
- setNilValueForKey 这个方法是干嘛的?
假如有一个对象是基本数据类型,当给他setvalue为nil时,就会出现crash。这个时候实现一下这个方法就可以啦,在里边做一些处理。
- (void)setNilValueForKey:(NSString *)key
{
[self setValue:@(11) forKey:key];
NSLog(@"setNilValueForKey:%@",key);
}
6.如果有一个可变数组的属性,对这个属性进行kvo观察, [self.array addobject:@(1)],会触发kvo吗?
不会,需要这样写才会
[[self mutableArrayValueForKey:@"array"] addObject:@(1)];
7.kvc的应用场景有哪些?
设置控件的私有属性,tabbar。
字典转模型 最好能分析一下YYmodel的源码。
未完待续