iOS KVC底层原理浅析

KVC(Key-value coding)键值编码,简单理解就是可以直接通过key来访问对象的属性或者给对象属性赋值,不需要调用明确的存取方法.

KVC赋值原理:

当调用setValue: @""forKey:@""的时候,其底层调用顺序:首先寻找是否有这三种setter方法,按照查找顺序为set<Key>:-> _set<Key> -> setIs<Key>方法进行寻找,如果找到其中任何一个方法,就是直接给属性设置value值,如果找不到的话,KVC机制会检查+ (BOOL)accessInstanceVariablesDirectly方法有没有返回YES,默认该方法会返回YES,如果重写了该方法返回NO的话,系统会执行该对象的 setValue:forUndefinedKey:方法,默认抛出NSUndefinedKeyException类型的异常.

如果返回YES,则查找间接访问的实例变量进行赋值,查找顺序为:_<key> -> _is<Key> -> <key> -> is<Key>,如果上面列出的方法或者成员变量都不存在,系统将会执行该对象的setValue:forUndefinedKey:方法,默认是抛出异常

KVC取值原理:

当调用valueForKey:时,首先查找getter方法,按照get<Key> -> <key> -> is<Key> -> _<key>的方法顺序查找,找到的话会直接调用。如果是BOOL或者Int等值类型, 会将其包装成一个NSNumber对象,如果还没有找到,再检查类方法+ (BOOL)accessInstanceVariablesDirectly,如果返回YES(默认yes),那么和先前的设值一样,会按_<key>,_is<Key>,<key>,is<Key>返回NO的话,那么会直接调用valueForUndefinedKey:



posted @ 2021-10-28 15:43  XL-MS  阅读(46)  评论(0编辑  收藏  举报