KVC-鍵值編碼
KVC:對(duì)象取值或者設(shè)置值。
KVO:監(jiān)聽對(duì)象值的變化。
獲取對(duì)象值的優(yōu)先級(jí)
OC對(duì)象的屬性是由3部分組成的,包括成員變量,setter方法,getter方法。
KVC原理圖

image.png
KVC取值優(yōu)先級(jí)
1,查找對(duì)象的相關(guān)方法(getName,name,isName)。
2,看對(duì)象+(BOOL)accessInstanceVariablesDirectly的返回值,YES就查找成員變量,NO就報(bào)異常。
3,成員變量?jī)?yōu)先級(jí)。
例如獲取name的值
PersonModel *model = [[PersonModel alloc]init];
NSLog(@"%@",[model valueForKey:@"name"]) ;
對(duì)象方法高于成員變量,三個(gè)獲取值的get方法,優(yōu)先級(jí)如下
-(NSString *)getName{
return @"1111";
}
-(NSString *)name{
return @"2222";
}
-(NSString *)isName{
return @"3333";
}
成員變量查找優(yōu)先級(jí)依次如下,只要存在聲明就會(huì)優(yōu)先,不管有沒有值
@interface PersonModel : NSObject{
NSString *_name;
NSString *_isName;//注意大寫
NSString *name;
NSString *isName;//注意大寫
}
KVC設(shè)值
KVC設(shè)置值優(yōu)先級(jí)和取值類似
1,查找對(duì)象的相關(guān)方法(setKey,setIsName)。
2,看對(duì)象+(BOOL)accessInstanceVariablesDirectly的返回值,YES就查找成員變量,NO就報(bào)異常。
3,成員變量?jī)?yōu)先級(jí),外界可以通過(guò)KVC修改成員變量。
例子,通過(guò)KVC設(shè)置person的name
PersonModel *person = [[PersonModel alloc]init];
[person setValue:@"kvo" forKey:@"name"];
相關(guān)方法
-(void)setName:(NSString *)name{
NSLog(@"setName%@",name);
}
-(void)setIsName:(NSString *)name{
NSLog(@"setIsName%@",name);
}
知識(shí)點(diǎn)
1,嵌套的拿數(shù)據(jù)方法valueForKeyPath,例如person里的dog的age屬性,依次查找dog和age,查找方法和valueForKey是一樣的。
id age = [person valueForKeyPath:@"dog.age"];
2,找不到成員變量報(bào)異常避免崩潰的方法
-(id)valueForUndefinedKey:(NSString *)key{
return nil;
}
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
NSLog(@"沒有找到%@",key);
}
-(void)setNilValueForKey:(NSString *)key{
NSLog(@"不能將%@設(shè)置為nil",key);
}
利用runtime獲取對(duì)象的全部成員變量
/// 獲取對(duì)象全部的成員變量
-(void)getAllProperty{
unsigned int count = 0;
//將對(duì)象的成員屬性列表拷貝出來(lái),count引用傳遞,可以拿到對(duì)象成員變量的個(gè)數(shù)
Ivar *ivars = class_copyIvarList([self class], &count);
//
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i<count; i++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *propertyName = [NSString stringWithUTF8String:name];
[arr addObject:propertyName];
}
NSLog(@"\n-----%@的成員變量-----\n%@\n------------------------------",NSStringFromClass([self class]),arr);
free(ivars);
}
KVC的運(yùn)算符
PersonModel *p1 = [[PersonModel alloc]init];
p1.age = 13;
PersonModel *p2 = [[PersonModel alloc]init];
p2.age = 11;
PersonModel *p3 = [[PersonModel alloc]init];
p3.age = 15;
NSMutableArray *arr = [NSMutableArray array];
[arr addObjectsFromArray:@[p1,p2,p3]];
//KVC的運(yùn)算符,主要針對(duì)數(shù)組,包括@max,@min,@sum,@avg,@count
NSLog(@"屬性中的最大值是%@",[arr valueForKeyPath:@"@max.age"]);