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