【面试题】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