iOS开发底层细究:KVC和KVO底层原理 | iOS开发 - CocoaChina CocoaChina_让移动开发更简单
KVO底层原理分析 | iOS开发 - CocoaChina CocoaChina_让移动开发更简单
KVC全称是Key Value Coding,定义在NSKeyValueCoding.h文件中,是一个非正式协议。KVC提供了一种间接访问其属性方法或成员变量的机制,可以通过字符串来访问对应的属性方法或成员变量。
一、get
#import "Animal.h"
@interface Man : Animal
@end
#import"Man.h"
@implementation Man
//- (NSString *)getName{ // 第一个被调用
// NSLog(@"%s",__func__);
// return @"test_three";
//}
//- (NSString *)name{ // 第二个被调用
// NSLog(@"%s",__func__);
// return @"test_one";
//}
//
//- (NSString *)isName{ // 第三个被调用
// NSLog(@"%s",__func__);
// return @"test_two";
//}
- (NSUInteger)countOfName{ //数组查询步骤一
NSLog(@"%s",__func__);
return 3;
}
- (id)objectInNameAtIndex:(NSUInteger)index{//数组查询步骤二
NSLog(@"%s",__func__);
return [NSString stringWithFormat:@"test_seven %ld",index];
}
- (id)valueForUndefinedKey:(NSString*)key{
NSLog(@"%s",__func__);
return @"test_six";
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Man *Tom = [[Man alloc] init];
NSString *name = [Tom valueForKey:@"name"];
NSLog(@"Tom's name is %@",name);
/**
* 默认name的值为字符串:1、先查找 getName 2、然后查找 name 3、再查找 isName
* 其他类型
*/
}
二、set
#import "Animal.h"
@interface Dog : Animal
{
NSString*name;
NSString*isName;
NSString*_name;
NSString*_isName;
}
- (void)printName;
@end
#import"Dog.h"
@interface Dog()
@end
@implementation Dog
- (void)printName{
NSLog(@"name is %@",name);
NSLog(@"isName is %@",isName);
// NSLog(@"_name is %@",_name);
// NSLog(@"_isName is %@",_isName);
}
- (void)setValue:(id)value forUndefinedKey:(NSString*)key{
NSLog(@"%s",__func__);
}
+ (BOOL)accessInstanceVariablesDirectly{
return NO; //默认是YES
}
//- (void)setName:(NSString *)name{
// NSLog(@"%s",__func__);
//}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Dog *dog = [[Dog alloc] init];
[dog setValue:@"DaHuang" forKey:@"name"];
[dog printName];
/**
* 1、_name 2、_isName 3、name 4、isName
*/
}