簡單總結一下NotificationCenter、KVC、KVO、Delegate

碼鋒窩發表於2016-07-28

將最近總結的最常用的幾種設計模式優勢與區別自己小結一下,分享給大家。

kvo只能用來對屬性作出反應,而不會用來對方法或者動作作出反應,是實現一個物件與另外一個物件保持同步的一種方法,能夠提供觀察的屬性的最新值以及先前值,同時它是一種響應式程式設計思想,也就是開發中不需要考慮呼叫順序,只需要知道考慮結果,類似於蝴蝶效應,產生一個事件,會影響很多東西,最後影響結果,比如開發中用KVO來監聽一個dog類的name屬性有沒有改變,不需要知道是在哪裡做了修改,只要是修改了就收監聽到結果。而kvo的底層其實是重寫了name屬性的set方法,而能夠用外界修改name的時候呼叫set方法就是修改了當前物件的一個isa指標來實現的。它有點類似於swift中的儲存型屬性中的didSet方法的監聽。
 
KVC其實就是鍵值編碼,物件在呼叫setValue的時候,首先會去找屬性的set方法—>成員屬性——>直接找物件的這個屬性—>報錯,比如在字典轉模型的時候這個方法就經常會用到,而這裡有個坑就是當模型中的屬性和字典的key不一一對應,系統就會呼叫setValue:forUndefinedKey:報錯。所以一般我們會重寫這個方法防止報錯。
 
block 是一種資料型別,我在開發中主要使用在3個場景:1,它作為一個程式碼塊儲存在物件中,需要的去呼叫就可以,在傳值的時候用的特別多。2.作為方法的引數,它的實現由外部來決定,這樣方法用起來就比較靈活了。3.作為方法的返回值,它的目的就是代替方法,在這個block作為返回值裡可以進行很多的操作,外部呼叫這個方法的時候只需要知道傳入的引數是什麼就可以,不用知道內部是怎麼實現的。實際開發中需要注意的是它的迴圈引用的問題,block 是 C 的,一般在ARC使用strong,MRC使用copy。
 
代理其實一般是控制器定義的一個協議,當控制器或某個物件遵循了這個協議,並實現了代理方法,就可以通過代理方法來完成不同物件的一些操作或資料傳遞了。代理有嚴格的語法,能夠實現的方法必須有明確的宣告。還有就是代理是一對一的,在一個應用中的控制流程是可以追蹤的,而由於通知是可以實現多對多,是很難追蹤到的,這點在做除錯的時候代理檢測起來就比通知好多了,在專案中,代理在控制器值的逆傳這塊是用得比較多,而且也是比較好用的,做一些簡單的回撥。比如我在底層介面的功能完成了,需要把一些值傳到上一層去,這時候用代理就是比較直接高效了。
 
Notification: 是一種觀察者模式,通知的實現比代理要簡單得多,而且它是多對多的。通知一般在開發中除了需要監聽一些系統的響應,如鍵盤彈出等,就是用在比如開發模組之間聯絡不怎麼緊密而又需要傳值,還有就是多執行緒之間傳值的情況,這時候用通知就比代理來得直接簡單了。但使用通知的時候一定要記得在釋放物件的時候將通知登出掉,避免出現野指標的現象。
 
 
有哪裡寫得不對或者寫漏的,還請大神們指出,後續改進。。。

相關文章