KVC (key value coding):間接通過(guò)字符串類(lèi)型的key取出對(duì)應(yīng)的屬性值
一.作用:
1.可以訪問(wèn)私有成員變量的值
例如訪問(wèn)person 對(duì)象的私有成員變量_height的值:

1.png
HMPerson *p = [[HMPerson alloc] init];
NSLog(@"%@", [p valueForKeyPath:@"_height"]);
或者可以使用下面的方法訪問(wèn)
NSLog(@"%@", [p valueForKeyPath:@"height"]);
(這個(gè)方法先調(diào)用height的get方法,如果沒(méi)有g(shù)et方法,再去訪問(wèn)_height的成員變量.)
2.可以間接修改私有成員變量的值(替換系統(tǒng)自帶的導(dǎo)航欄、tabbar)
3.kvc的其他作用
當(dāng)一個(gè)對(duì)象是id類(lèi)型的時(shí)候,不能使用點(diǎn)語(yǔ)法訪問(wèn)成員變量,但是仍然可以使用kvc進(jìn)行訪問(wèn).

2.png

3.png
[p valueForKeyPath:@"age"];
二.valueForKeyPath和valueForKey的區(qū)別:
// keyPath包含了key的功能
// key:只能訪問(wèn)當(dāng)前對(duì)象的屬性
// keyPath:能利用.運(yùn)算符一層一層往內(nèi)部訪問(wèn)屬性
例如:對(duì)HMPerson曾加自定義HMDog屬性

dog.png

person.png

6.png
此時(shí)要通過(guò)kvo訪問(wèn)name屬性只能使用valueForKeyPath
NSLog(@"%@", [p valueForKeyPath:@"dog.name"]);
三.kvc在數(shù)組中的其他用途
例如person對(duì)象添加book自定義屬性

book.png

8.png
獲取所有書(shū)名
NSArray *names = [p valueForKeyPath:@"books.name"];
NSArray *names = [p.books valueForKeyPath:@"name"];
獲取書(shū)籍總價(jià)
double sumPrice = [[p valueForKeyPath:@"books.@sum.price"] doubleValue];
獲取書(shū)籍最大值
double sumPrice = [[p valueForKeyPath:@"books.@max.price"] doubleValue];
獲取書(shū)籍最小值
double sumPrice = [[p valueForKeyPath:@"books.@min.price"] doubleValue];
獲取書(shū)籍平均價(jià)格
double sumPrice = [[p valueForKeyPath:@"books.@avg.price"] doubleValue];
計(jì)算數(shù)組長(zhǎng)度
NSLog(@"%@", [p valueForKeyPath:@"books.@count"]);