【面试题】KVC 相关
KVC 的实现原理
setValue:forKey:
利用 hopper 分析 setValue:forKey:
实现:
大概实现流程:
graph TB A[setValue:forKey:] --> B[_createValueSetterWithContainerClassID:key:] B-->C[按顺序查找 set 方法<br/>setKey:<br/>_setKey:<br/> setIsKey:] C-->D{是否查找到方法} D-->|是|E[调用该方法] D-->|否|F{accessInstanceVariablesDirectly} F-->|YES|G[按顺序查找实例变量<br>_key<br>_isKey<br>key<br>isKey] F-->|NO|H[NSUnknownKeyException:<br>'setValue:forUndefinedKey:'<br> this class is not key value coding-compliant for the key foo.] G-->I{是否查找到实例变量} I-->|是|J[修改实例变量] I-->|否|K[NSUnknownKeyException:<br>'setValue:forUndefinedKey:'<br> this class is not key value coding-compliant for the key foo.]
valueForKey:
利用 hopper 分析 valueforKey:
实现:
大概实现流程:
graph TB A[valueforKey:] --> B[_createValueGetterWithContainerClassID:key:] B-->C[按顺序查找 get 方法<br/>getKey<br/>key<br/> isKey<br/>_getKey<br/>_key] C-->D{是否查找到方法} D-->|是|E[调用该方法] D-->|否|F{accessInstanceVariablesDirectly} F-->|YES|G[按顺序查找实例变量<br>_key<br>_isKey<br>key<br>isKey] F-->|NO|H[NSUnknownKeyException:<br>'setValue:forUndefinedKey:'<br> this class is not key value coding-compliant for the key foo.] G-->I{是否查找到实例变量} I-->|是|J[获得实例变量] I-->|否|K[NSUnknownKeyException:<br>'setValue:forUndefinedKey:'<br> this class is not key value coding-compliant for the key foo.]
accessInstanceVariablesDirectly
accessInstanceVariablesDirectly
默认返回 YES:
示例项目
https://github.com/Coder-ZJQ/demos/tree/master/interview/oc-kvc-impl