KVC的底層實現原理


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:能利用運算符一層一層往內部訪問屬性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM