iOS KVC 实现原理
很多面试的时候都会问,KVC 会 触发 KVO 吗?,答案是会的,这个问题太容易验证了,写个 DEMO 调用下 KVC 然后 KVO 监听下就知道了,但是为什么会触发的?
当我们 使用 setValueForKey 或者 keyPath 的时候,系统会首先查找是否有 setKey,的方法,当有这个方法的时候,就会去调用这个set方法,如果调用了 set 方法,自然而然就会触发我们的 KVO。
然后去查找是否有 _setKey 方法,找到就会调用这两个方法。
如果上面两个set 方法都没有查找到,就会去调用 +(BOOL)accessInstanceVariablesDirectly
这个方法,如果返回 YES ,就代表可以直接反问成员变量,如果返回 NO ,则不允许访问,如果返回 NO ,再调用 KVC 的时候,就会跑出异常崩溃,跑出setvalueforundefinedkey那个错误。
如果上面的方法返回 YES ,就表示允许访问成员变量,比如,我们通过 kvc 设置 age 属性,[self setValue:@10 forKey:@"age"];
那么系统会去依次查找这四个成员变量,然后赋值 int _age; int _isAge; int age int isAge
,如果发现有其中一个成员变量就会立刻赋值。
总结:先查找 set 方法,然后询问是否允许访问成员变量,如果允许,给成员变量赋值,就算没有set方法,kvc 内部也是会触发kvo的
网友评论