1.赋值操作
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
赋值规则
按照setKey:、_setKey:顺序查找方法,如果找到直接调用方法赋值
- (void)setKey:(id)key {
_key = key;
}
- (void)_setKey:(id)key {
_key = key;
}
如果找不到调用accessInstanceVariablesDirectly 获取返回值
是否允许访问成员变量,如果允许
按照_key、_isKey、key、isKey顺序查找成员变量,找到直接赋值

赋值.jpeg
2.取值操作
- (nullable id)valueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
取值规则
按照getKey、key、 isKey、_key顺序查找方法,如果找到直接调用方法赋值
- (id)getKey {
return:_key;
}
- (id)key {
return:_key;
}
- (id)isKey {
return:_key;
}
- (id)_key {
return:_key;
}
如果找不到调用accessInstanceVariablesDirectly 获取返回值
是否允许访问成员变量,如果允许
按照_key、_isKey、key、isKey顺序查找成员变量,如果找到直接获取值

取值.jpeg
3.用赋值KVC操作是否会触发KVO
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
KVC操作会触发KVO
内部实现大概是
[self willChangeValueForKey:@"age"]; // 将会改变
//...
[self didChangeValueForKey:@"age"]; // 改变
网友评论