关于ios:iOS底层系列KVC

47次阅读

共计 915 个字符,预计需要花费 3 分钟才能阅读完成。

前言

明天咱们简略聊一下 KVC,键值编码。
平时咱们给属性赋值或者取值都是应用点语法,调用属性的 set 或者 get 办法,除此之外苹果还为咱们提供另一种办法,应用 key 或者能够 keyPath 赋值或者取值。

// 赋值
- (void)setValue:(nullable id)value forKey:(NSString *)key;

- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
- 
// 取值
- (nullable id)valueForKey:(NSString *)key;

- (nullable id)valueForKeyPath:(NSString *)keyPath;

具体应用咱就不提了,说说 KVC 底层具体的实现逻辑吧

赋值

当咱们调用了 setValue:forKey: 的时候,比方咱们执行上面代码

[person1 setValue:@10 forkey:@"age"];

零碎会依照 setAge:_setAge: 的程序,查找 person 类中是否实现了这些办法(其中之一即可),如果找到了,则间接调用办法,如果这两个办法否没有找到,上面就从 Person 类中查找 + (BOOL)accessInstanceVariablesDirectly 这个办法的返回值。

默认该办法返回的是 YES,通过返回值管制是否容许间接给成员变量赋值。因为有些时候咱们只是创立了一个成员变量,向上面代码中这样,并没有 set 办法,所以就要看是否容许间接给成员变量设置值。

@interface Person : NSObject
{
 @public
 int _age;
}
@end

如果不容许间接给成员变量赋值,则间接抛出 NSUnknownKeyException 谬误。

如果是容许给成员变量间接设置值,则会依照_age, _isAge, age, isAge 顺便,顺次查找成员变量,查找到成员变量,间接赋值,如果找不到这几个成员变量,抛出 NSUnknownKeyException 谬误。

这就是赋值的整个流程,蛮简略的,可能就是这几个程序容易混掉。

取值

取值的流程跟赋值其实是一样的,只是最开始查找的取值办法是不一样的,大家能够对照下图看一下

正文完
 0