KVC是OC特有的,本質是在運行時動態的給對象發送setValue:forKey 消息,設置數值 -調用super.init 保證對象已經被創建完成 .當給對象發送setValue:forKey 消息時要判斷對象是否存在key所對應的屬性,直接賦值 如果沒有就調用undefinedKey(默認崩潰,需要重寫)
先去檢查是否存在setter,getter方法,如果不存在,它將在內部查找名_key或key的實例變量。如果
還是沒有那就會報錯誤。通過KVC 可以獲取不存在getter方法的對象值,無需通過對象指針直接訪問。
如果對象的實例變量為基本數據類型時(例如:char,int,float,BOOL),我們需要對這些數據類型進行封裝。
setValue:forKey的調用順序首先會尋找set<key>方法,如果沒有就去找_<key> _is<Key> <key> is<key> 順序尋找,如何還沒找到就調用undefinedKey(默認崩潰,需要重寫).
ValueForKey的調用順序 按照get<key>, <key> is<key> 順序尋找,如果沒有找到按照_<key> _is<key> <key> is<key>順序尋找,如何還沒找到就調用undefinedKey(默認崩潰,需要重寫).
KVC的價值:
1.可以訪問私有成員的值
2.可以間接修改私有成員變量的值(替換系統自帶的導航欄,tabBar)
3.應用一些字符做簡單運算(sum,min,max,avg,count)比如直接計算數組元素之間的關系
//屬性相加 NSString *sum= [persons valueForKeyPath:@"Person.@sum.age"]; NSLog(@"sum = %@",sum); //數量 NSString *count= [persons valueForKeyPath:@"Person.@count.age"]; NSLog(@"count = %@",count); //最大值 NSString *max= [persons valueForKeyPath:@"Person.@max.age"]; NSLog(@"max = %@",max); //最小值 NSString *min= [persons valueForKeyPath:@"Person.@min.age"]; NSLog(@"min = %@",min); //平均值 NSString *avg= [persons valueForKeyPath:@"Person.@avg.age"]; NSLog(@"avg = %@",avg);
valueForKeyPath和valueForKey的區別:
前者其實可以完全包含后者的
Key:只能訪問當前對象的屬性
KeyPath:能利用運算符一層一層往內部訪問屬性