赋值
- KVC 会按照一定顺序进行赋值:
setKey:, _setKey: , _key, _isKey, key, iskey
- 方法 accessInstanceVariablesDirectly 控制是否能访问成员变量
- 底层实现会在实际赋值前后添加
willChangeValueForKey:
和didChangeValueForKey:
方法, 所以KVC 一定会触发 KVO
取值
KVC 会按照一定顺序进行取值: getKey, key, isKey, _key
// KVC 全称 "Key Value Coding"
#import <Foundation/Foundation.h>
void _aboutKVC(void);
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
_aboutKVC();
}
return 0;
}
@interface Person : NSObject {
int _gender;
}
@property (nonatomic, assign) int age;
@end
@implementation Person
@synthesize age = _age;
// KVC 会优先访问这个 setter
- (void)setAge:(int)age {
_age = age;
}
// KVC 如果找不到普通的 setter, 就会找带有下划线的
- (void)_setHeight:(double)height {
NSLog(@"heightv--> %lf", height);
}
// 该方法用于控制是否可以用 KVC 访问成员变量, 优先查找带有下划线的成员变量_key, _isKey, key, iskey
+ (BOOL)accessInstanceVariablesDirectly {
return YES;
}
// 取值原理 按照以下顺序
- (int)getAge {
return _age;
}
- (int)age {
return _age;
}
- (int)isAge {
return _age;
}
- (int)_age {
return _age;
}
@end
void _aboutKVC() {
Person *person = Person.new;
// 普通的赋值和读取
person.age = 10;
NSLog(@"%d", person.age);
// KVC
// KVC 会调用 set 方法, 具体看 Person 类实现
[person setValue:@20 forKey:@"age"];
NSLog(@"%d", [[person valueForKey:@"age"] intValue]);
[person setValue:@172.1 forKey:@"height"];
[person setValue:@2 forKey:@"_gender"];
NSLog(@"%d", [[person valueForKey:@"_gender"] intValue]);
}
网友评论