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: