iOS kvc问题总结

255 阅读1分钟

1.KVC是什么?

KVC是key-value-coding.可以根据key值去直接访问和修改对象的属性值,包括私有属性的值。

2.readonly的属性可以修改吗?

可以

  1. [object setvalue:value forkeypath:@"key"]方法查找顺序是怎么样的?
  • 按照setKey、_setKey、setIsKey的顺序去找setter方法。
  • 没找到的话,调用accessInstanceVariablesDirectly 方法,返回YES的话,按照_key、_isKey、key、isKey查找成员变量。
  • 如果返回NO,进入- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法,进行处理。
  • 没有实现这个方法,直接抛出异常。
  1. [object valueForKey:@"key"]取值时,方法查找顺序是什么样的?
  • 按照getKey:、key、isKey的顺序查找getter方法。
  • 如果没有找到三个方法中的任意一个,那么进入+ (BOOL)accessInstanceVariablesDirectly方法判断是否允许取成员变量的值
  • 返回yes的话,按照_key、_isKey、 key、isKey去取对应成员变量的值。
  • 还是没有找到的话,调用- (nullable id)valueForUndefinedKey:(NSString *)key方法
  • 如果这个方法没有实现的话,就抛出异常。
  1. 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的源码。

未完待续

参考链接:www.jianshu.com/p/918336517…