主要分成一下幾個部分
1.KVC
1.1 KVC簡介
1.2 KVC使用
2.KVO
2.1 KVO簡介
2.2 KVO使用
KVC
1.1 KVC簡介
什么是KVC?
KVC-> Key,Value,Coding亮垫,鍵值編碼。
通常我們調(diào)用方法或者訪問實例屬性的方式僧诚,得到或者修改屬性值恬偷。
KVC則是直接利用字符串描述對對象屬性進行訪問荔茬。
KVC的方法
- (nullable id)valueForKey:(NSString *)key; //直接通過Key來取值
- (void)setValue:(nullable id)value forKey:(NSString *)key; //通過Key來設(shè)值
- (nullable id)valueForKeyPath:(NSString *)keyPath; //通過KeyPath來取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; //通過KeyPath來設(shè)值
1.2 KVC使用
1.訪問對象屬性(直接方法,通過關(guān)系式訪問)
方法:
直接訪問
- (nullable id)valueForKey:(NSString *)key;
通過關(guān)系訪問
- (nullable id)valueForKeyPath:(NSString *)keyPath;
例如:
[person valueForKeyPath:@"address.city"];
Person有一個address屬性,address屬性中有一個city屬性。
注意:valueForKeyPath:返回跟接受者相關(guān)的路徑的值焕梅。
如果路徑里面沒找到师脂,就會調(diào)用valueForUndefineKey方法
2.訪問私有成員變量
KVC還可以更改私有成員變量担孔。利用KVC我們可以訪問賦值一個對象的私有成員。
但是如果說這樣,是不是就能去修改蘋果里面的一些私有東西了?
建議還是不要3跃8馄!在app上架前審核的過程中酌心,蘋果的官方會對這類做法嚴(yán)格檢查拌消,如果發(fā)現(xiàn),蘋果的審核時不能通過的安券。
KVO
2.1 KVO簡介
什么是KVO墩崩?
KVO是一個種觀察者設(shè)計模式。比如:指定一個被觀察對象(例如Person類)侯勉,當(dāng)對象某個屬性(例如Person中的字符串name)發(fā)生更改時鹦筹,對象會獲得通知,并作出相應(yīng)處理址貌;
【且不需要給被觀察的對象添加任何額外代碼铐拐,就能使用KVO機制】
KVO基本原理:
當(dāng)觀察對象A時徘键,KVO會動態(tài)的創(chuàng)建一個對象A的當(dāng)前類的子類,并且重寫了新的子類的被觀察屬性keyPath的setter方法遍蟋。setter方法隨后負責(zé)通知觀察對象屬性改變的狀況吹害。
具體來講:
1.觀察對象時,會動態(tài)創(chuàng)建一個新類:NSKVONotifying_A,并且A對象的isa指針指向新類匿值。A對象就變成新類的對象了赠制。
2.重寫了新類中觀察的屬性的setter方法。新的setter方法會負責(zé)在調(diào)用員setter方法之前和之后挟憔,通知所有觀察對象屬性值的更改情況钟些。
3.KVO的:KVO的鍵值觀察通知依賴于 NSObject 的兩個方法:willChangeValueForKey:和 didChangevlueForKey:,在存取數(shù)值的前后分別調(diào)用2個方法绊谭。
使用注意:
1.觀察者觀察的是屬性政恍。只有執(zhí)行了setter方法,或者使用KVC賦值才會觸發(fā)KVO機制达传。
比如給成員變量_name = @“Hayder” 就不會觸發(fā)KVO機制篙耗。
2.2 KVO使用
KVO使用步驟
1.注冊觀察者,實時監(jiān)聽
2.在回調(diào)方法中處理屬性變化
3.移除觀察者
實現(xiàn)方法:
1.注冊觀察者:
//第一個參數(shù)observer:觀察者 (這里觀察self.myKVO對象的屬性變化)
//第二個參數(shù)keyPath: 被觀察的屬性名稱(這里觀察self.myKVO中num屬性值的改變)
//第三個參數(shù)options: 觀察屬性的新值宪赶、舊值等的一些配置(枚舉值宗弯,可以根據(jù)需要設(shè)置,例如這里可以使用兩項)
//第四個參數(shù)context: 上下文搂妻,可以為kvo的回調(diào)方法傳值(例如設(shè)定為一個放置數(shù)據(jù)的字典)
[A addObserver:self forKeyPath:@"name" options:
NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
2.屬性(keyPath)的值發(fā)生變化時蒙保,收到通知,調(diào)用一下方法.
//keyPath:屬性名稱
//object:被觀察的對象
//change:變化前后的值都存儲在change字典中
//context:注冊觀察者時欲主,context傳過來的值
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
}