關于KVC分析總結筆記

KVC基礎理解

KVC全稱Key-Value-Coding俗稱鍵值編碼,可以通過一個key訪問某個屬性
API:

- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
- (nullable id)valueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;

通過如下示例使用:

GYPerson *person = [[GYPerson alloc] init];
[person setValue:@(2) forKey:@"age"];
NSLog(@"%ld", (long)person.age);

KVC :setValue:forKey:的原理

圖1.jpg

根據示例圖,我們可以觀察到,如果存在setValue:_setValue,就正常傳遞參數,設置值。
一、同時存在setValue:_setValue,優先調用setAge:(NSInteger)age;
圖2.jpg

二、不存在setValue,則調用_setAge:(NSInteger)age;
圖3.jpg

三、如果不允許直接訪問成員變量,直接報錯
圖4.jpg

四、默認允許訪問成員變量,不存在setValue:_setValue方法時,他會按順序查找_key,_isKey,key,isKey。我們在GYPerson.h中定義相關成員變量。

@interface GYPerson : NSObject {
    NSInteger _age;
    NSInteger _isAge;
    NSInteger age;
    NSInteger isAge;
}
@end

圖5.jpg

優先向_key賦值,其它以此類推可驗證。

valueForKey:原理

會觸發

圖6.jpg

驗證可與setValue:forKey:的原理一致

通過KVC修改屬性是否會觸發KVO

圖7.jpg
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發中,可以允許開發者通過K...
    暮年古稀ZC閱讀 2,164評論 2 9
  • KVC(Key-value coding)鍵值編碼,單看這個名字可能不太好理解。其實翻譯一下就很簡單了,就是指iO...
    我的夢工廠閱讀 901評論 1 8
  • KVC/KVO 概念 KVC : 即 Key-Value-Coding,用于鍵值編碼。作為 cocoa 的一個標準...
    滿臉胡茬的小碼農閱讀 1,978評論 2 8
  • KVC(Key-valuecoding)鍵值編碼,單看這個名字可能不太好理解。其實翻譯一下就很簡單了,就是指iOS...
    榕樹頭閱讀 723評論 0 2
  • Swift1> Swift和OC的區別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,135評論 1 32