KVC的底层原理

1、基本getter的搜索模式

当一个对象调用valueForKey:方法取值的时候,他的内部执行以下过程。

1.在实例中搜索找到具有名称的第一个访问器方法get,is,或者_,按照这个顺序。如果找到,则调用它并执行步骤5。否则,请继续下一步。

2.判断是否是数组,如果是数组则对数组中的每个对象一次调用valueForKey:方法,并返回一个新的数组。否则就执行步骤3。

3.判断是否是NSSet,如果是集合则对集合中的每个对象一次调用valueForKey:方法,并返回一个新的集合。否则就执行步骤4。

4.调用accessInstanceVariablesDirectly方法,判断是否启用实例变量的查找,默认是YES,也就是启用,当返回为YES时,将按照这个_, _is, , or is,来一次查找。我们可以通过重写这个方法来禁用实例变量的查找。

5.如果检索到的属性值是对象指针,则只需返回结果。如果该值是NSNumber支持的标量类型,则将其存储在NSNumber实例中并返回它。如果结果是NSNumber不支持的标量类型,请转换为NSValue对象并返回该对象。

6.如果所有的方法均失败,则调用valueForUndefinedKey:。 默认情况下,这会抛出一个异常,但是NSObject的子类可以通过重写这个方法,来定制一些特性的功能。

2、基本setter的搜索模式

setValue:forKey:的默认实现(给定键和值参数作为输入),尝试将名为key的属性设置为value,在使用这个方法设置值时,对象的内部会经历以下流程。

1.按该顺序查找名为set :或_set 的第一个访问器。 如果找到,请使用输入值调用它并完成。

2.如果没有找到setter访问器,并且类方法accessInstanceVariablesDirectly返回YES,则按该顺序查找名称类似于_ ,_ is 或is 的实例变量。 如果找到,直接用输入值设置变量并完成操作。

3.在找不到访问器或实例变量后,调用setValue:forUndefinedKey:。 默认情况下,这会抛出一个异常,但是NSObject的子类可以通过重写这个方法来提供特定的操作。

你可能感兴趣的:(KVC的底层原理)