KVC原理剖析 - CocoaChina_讓移動(dòng)開(kāi)發(fā)更簡(jiǎn)單
KVO底層原理分析 | iOS開(kāi)發(fā) - CocoaChina CocoaChina_讓移動(dòng)開(kāi)發(fā)更簡(jiǎn)單
KVC全稱是Key Value Coding国章,定義在NSKeyValueCoding.h文件中亲铡,是一個(gè)非正式協(xié)議。KVC提供了一種間接訪問(wèn)其屬性方法或成員變量的機(jī)制回挽,可以通過(guò)字符串來(lái)訪問(wèn)對(duì)應(yīng)的屬性方法或成員變量。
一猩谊、get
#import "Animal.h"
@interface Man : Animal
@end
#import"Man.h"
@implementation Man
//- (NSString *)getName{ // 第一個(gè)被調(diào)用
//? ? NSLog(@"%s",__func__);
//? ? return @"test_three";
//}
//- (NSString *)name{?// 第二個(gè)被調(diào)用
//? ? NSLog(@"%s",__func__);
//? ? return @"test_one";
//}
//
//- (NSString *)isName{?// 第三個(gè)被調(diào)用
//? ? NSLog(@"%s",__func__);
//? ? return @"test_two";
//}
- (NSUInteger)countOfName{? //數(shù)組查詢步驟一
? ? NSLog(@"%s",__func__);
? ? return 3;
}
- (id)objectInNameAtIndex:(NSUInteger)index{//數(shù)組查詢步驟二
? ? 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);
? ? /**
?? ? *? 默認(rèn)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; //默認(rèn)是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
?? ? */
}