一、delegate和block
1、delegate和block的區(qū)別?block需要注意什么?
delegate由代理設(shè)計模式演變而來,block是一種閉包的實現(xiàn)。
block的優(yōu)點:
(1)更輕便,使用也簡單
(2)能夠直接訪問上下文
(3)易于閱讀
缺點:
(1)如果有多個方法,需要每個方法實現(xiàn)一個block,很煩瑣
(2)可能會造成循環(huán)引用
(3)block使用會出現(xiàn)內(nèi)存復(fù)制,成本更高
delegate優(yōu)點:
(1)設(shè)計更加清晰,規(guī)范
(2)易于書寫文檔
(3)當(dāng)有多個相關(guān)方法時,實現(xiàn)更加簡單
(4)使用成本低
缺點:
(1)代碼更為復(fù)雜
(2)不易于閱讀和維護(hù)
2、delegate修飾詞使用weak,為什么不適用strong和assign?
使用weak修飾,指向指針的對象不會被持有,引用計數(shù)不變,當(dāng)指針指向的對象被釋放時,會置為nil,使用strong的話會持有對象,這樣會引起循環(huán)引用,使用assign和weak是相同的,唯一的區(qū)別就是當(dāng)指向的對象被釋放后,weak置為nil,再次發(fā)送消息,不會崩潰,而assign則成為野指針,再次發(fā)送消息,會引起崩潰。
二、KVC和KVO
1、什么是KVC和KVO?
KVC - Key-Value-Coding 鍵值編碼是一種使用字符串間接訪問對象屬性的一種機(jī)制。鍵值編碼的間接訪問方式其實是存取方法的一種代替,通過鍵值編碼可以訪問對象的公有變量和私有變量。
- (nullable id)valueForKey:(NSString *)key;
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
KVO - Key-Value-Observing 鍵值觀察是基于KVC實現(xiàn)的一種觀察者機(jī)制,提供了觀察對象的某一個屬性變化的監(jiān)聽方法。
//監(jiān)聽方法
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
//移除監(jiān)聽方法
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
//通知方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context;
2、KVO的原理是什么?
KVO利用runtime的機(jī)制,當(dāng)對一個對象進(jìn)行觀察時,會在運行時創(chuàng)建一個該對象的子類,這個子類一般以NSKVONotifying_xxx(xxx為父類的名字)命名,子類中會重寫所有被觀察屬性的set方法,除了創(chuàng)建子類,還會將該對象的isa指針指向這個子類,當(dāng)被觀察的對象屬性修改時,通過isa找到子類,在通過子類的方法列表找到對應(yīng)的set方法,set方法是被重寫過得,里面實現(xiàn)了相關(guān)的通知。