KVC简单理解

来源:互联网 发布:mac系统星际2打不开 编辑:程序博客网 时间:2024/06/16 16:21

1.KVC到底是个啥?

KVC(NSKeyValueCoding)是一种非正式协议,Key-Value coding是一种机制间接访问对象的属性,使用字符串识别属性,而不是通过调用一个访问器方法或直接访问实例变量。

2.KVC原理

Key就是一个字符串来表示特定属性,通常对应一个访问器方法或者接收对象的实例变量。Key必须使用ASCII编码,以小写字母开头,不包含空格。

Key Path其实就是指定实例变量的key,一般使用点方法操作(address.street)。

依据Keys 和 Key Paths 提供的访问对象属性的方法:

- (void)setValue:(nullableid)value forKey:(NSString *)key;

- (nullableid)valueForKey:(NSString *)key;

- (void)setValue:(nullableid)value forKeyPath:(NSString *)keyPath;

- (nullableid)valueForKeyPath:(NSString *)keyPath;

根据key(key Path)获取值,valueForKey:(valueForKeyPath:),如果没有访问器或实例变量,发送一个valueForUndefinedKey:消息,如果没有实现,默认的valueForUndefinedKey:会抛出NSUndefinedKeyException异常

根据key(key Path)设置值,setValue:forKey: (setValue:forKeyPath:),如果key不存在,发送一个setValue:forUndefinedKey:消息,如果没有实现,默认的valueForUndefinedKey:会抛出NSUndefinedKeyException异常

3.KVV键值验证(Key-Value Validation

KVV提供一个验证方法,格式为validate<Key>:error:,如果有一个属性位name,则实现为- (BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError;。

KVV提供- (BOOL)validateValue:(inoutid__nullable *__nonnull)ioValue forKey:(NSString *)inKey error:(outNSError **)outError方法,使用此方法再分别调用指定属性的验证方法。

在使用验证方法的时候,可以根据自己的需求定制验证的条件。验证方法不会自动调用,根据需求需要自己实现并主动调用。

4.KVC的实现

KVC运用了isa-swizzling技术。isa-swizzling就是类型混合指针机制KVC主要通过isa-swizzling来实现其内部定位查找。isa指针(is a kind of),指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的指针和其他数据。

当运行的时候就会被编译成:

SEL sel = sel_get_uid("setValue:forKey:");
IMP method = objc_msg_lookup(dic->isa,sel);
method(dic,sel,@"value",@"key");

其中,sel_get_uid函数是通过方法名得到一个方法选择器。
objc_msg_lookup:如果我们想用OC运行函数得到一个IMP,就可以使用objc_msg_lookup函数 。
这样KVC内部实现就可以这样描述了:
一个对象在调用setValue的时候,
1、根据方法名找到运行方法的时候所需要的环境参数。
2、他会从自己isa指针结合环境参数,找到具体的方法实现接口。
3、再直接查找得到的具体的方法实现。

0 0