面試技巧攻克-iOS中對象間通信機(jī)制

一、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)的通知。


WechatIMG401.jpeg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,132評論 1 32
  • 1.設(shè)計模式是什么? 你知道哪些設(shè)計模式,并簡要敘述? 設(shè)計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類...
    司馬DE晴空閱讀 1,315評論 0 7
  • 1.設(shè)計模式是什么? 你知道哪些設(shè)計模式,并簡要敘述?設(shè)計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,180評論 0 12
  • 充實的一天 昨天早上 不到5點就起來了,平時沒有這樣早起來過,好興奮,新的一天就要開始了,因為早上要去參加杭州...
    Amway博愛閱讀 148評論 0 0
  • 昨天聽了這本書,邊聽邊笑,太懂女人心了,說的就是我嗎?原來我后來轉(zhuǎn)變家庭關(guān)系是因為陰差陽錯用了書里的辦法。 男人和...
    雙胞胎媽媽_9a17閱讀 139評論 0 1