KVC原理

描述

Key-value coding is a mechanism enabled by the NSKeyValueCoding informal protocol that objects adopt to provide indirect access to their properties.

kvc 是由NSKeyValueCoding非正式协议采用的一种机制,对象通过该协议来提供属性的间接访问

在这里插入图片描述

在这里插入图片描述

执行结果为

IFLArchitecture[15333:450053] -[IFLKVCObject setName:] -- name: kvc_name1

根据测试,发现 setValue forKey, 会先判断是否含有setName, 有的话执行 setName

否则,判断有无 _setName ,有的话执行 _setName

如果 key不存在的话,

执行 - (void)setValue:(id)value forUndefinedKey:(NSString *)key

accessInstanceVariablesDirectly

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

如果 accessInstanceVariablesDirectly 返回YES

则 setValue forKey 根据 _ _is is 的顺序查找变量进行设置

如果 accessInstanceVariablesDirectly 返回NO

则 setValue forKey 将执行 setValue: forUndefinedKey:

现在把set的方法全都注释掉,看下成员变量 name们的值

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

发现就 _name有值

注释掉 _name 继续测试
在这里插入图片描述
在这里插入图片描述
此时 _isName 有值

注释掉 _isName 继续测试

在这里插入图片描述

在这里插入图片描述

此时 name 有值

注释掉 name 继续测试

在这里插入图片描述
在这里插入图片描述

此时 isName有值

set方法的执行顺序

在这里插入图片描述

如果我们通过注释测试,发现

set执行顺序为 set _set setIs

value设置的顺序为 _ _is is

get方法执行顺序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注释掉 set get

在这里插入图片描述

在这里插入图片描述

取值结果为null

因为取值顺序为 _ _is is

自定义KVC流程

自定义实现说白了就是对前面 key的拼接 大小写处理 判断方法实现

自定义setValue forKey

在这里插入图片描述

  • 顺序判断set _set setIs 是否实现

  • 判断 accessInstanceVariablesDirectly 是否允许直接访问实例变量

  • 顺序查找 _ _is is 实例变量

  • object_setIvar 实例变量赋值

在这里插入图片描述
自定义 getValueForKey 与 set大同小异

在这里插入图片描述

kvc自定义实现代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值