代理:
第一就是代理,這也是很常用的方式,特點是一對一
的形式蛋欣,而且邏輯結構非常清晰。實現(xiàn)起來較為簡單:
1.聲明協(xié)議
2.定義代理這個屬性如贷,
3.設置代理
最好在你想通知代理做事情的方法中調用即可陷虎。當然這里面有一些細節(jié),包括
①協(xié)議定義時杠袱,請用關鍵字@required尚猿,和@optional來明確代理是否必須實現(xiàn)某些方法
②代理的類型需用id類型,并寫明要遵守的協(xié)議,為防止循環(huán)引用代理屬性要用copy
③就是在調用代理方法的時候需要判斷代理是否實現(xiàn)該方法,以避免代理在回調時因為沒有實現(xiàn)方法而造成程序崩潰。
適用場景:
公共接口霞掺,回調方法較多也選擇用delegate進行解耦
iOS最常用tableViewDelegate谊路,textViewDelegate
通知:
通知的優(yōu)點很明顯,他是一對多
的形式菩彬,而且可以在任意對象之間傳遞,不需要二者有聯(lián)系潮梯,當然他的實現(xiàn)和代理相比較稍微繞一點骗灶,使用通知主要就3步:
1.在通知中心注冊,
2.發(fā)通知秉馏,
3.收通知耙旦。
這里面的注意點就是:
①對于系統(tǒng)沒有定義的事件監(jiān)聽時需要自己發(fā)通知,這是你就需要定義一個key萝究,是字符串類型免都,這也是通知的一個弊端,你需要拷貝到收通知的對象帆竹,避免寫錯一個字母而無法收通知的尷尬,可以定義成宏.
②就是注冊的通知中心需要手動移除绕娘,不然除了性能的問題還會有其他的問題出現(xiàn),比如說一個控制器消失了之后還有因為某些事件而發(fā)出通知栽连,造成不想要的結果险领。
使用場景:
1: 很多控制器都需要知道一個事件侨舆,應該用通知;
2 :相隔多層的兩個控制器之間跳轉
block:
block是C語言的,類是于C的函數(shù)
- 它是一種數(shù)據(jù)類型,可以當參數(shù)傳遞
- 說的簡單點block就是一組預先準備好的代碼,在需要的時候執(zhí)行,無論在哪調用绢陌,block的執(zhí)行都會回到block創(chuàng)建的地方執(zhí)行
使用場景:
異步和簡單的回調用block更好
Block最典型的是大所周知的AFNetWorking第三方庫
注意點:
1.當block作為屬性時,要用copy修飾
因為防止在MRC下,如果block訪問了外部變量,那么block就會存在棧區(qū),當Block所在的作用域結束時就會被銷毀,所以當在別的地方回掉時可能就會出錯,為了避免這種情況就需要手動調用Block的copy方法copy到堆區(qū),這也是Block當屬性時用copy的原因.在MRC下需要手動管理內存(需要程序猿手動copy到堆區(qū))
2.____weak
Block還有一個注意點就是,Block會對外部使用的變量和控制器進行強引用,為避免循環(huán)引用造成資源釋放不了,需要用__weak修飾外部變量和控制器
3.__block
block內部默認是不能修改外部變量的值,如果要修改使用__block修飾,一旦用__block修飾了,變量的地址就變成了堆區(qū)的地址.
KVO:
翻譯過來就是"鍵值觀察",用來監(jiān)聽對象的屬性值的變化,指定的被觀察的對象的屬性被修改后挨下,KVO就會通過回調方法自動通知相應的觀察者了,KVO和通知有點相似,使用步驟:
- 注冊,指定被觀察者的屬性,
- 實現(xiàn)回調方法
- 移除觀察
KVO底層原理實現(xiàn): KVO是基于runtime機制實現(xiàn)的
什么是isa?
每一個對象內部都有一個 isa 指針,這個指針是指向它的真實類型
根據(jù)這個指針就能知道將來調用哪個類的方法
KVO前后的isa變化
在addObserver:forKeyPath:options:context:之后脐湾,利用objective-c的runtime機制
把象p的isa變?yōu)榱?code>NSKVONotifying_Person臭笆。
所以,根據(jù)上面的isa介紹秤掌,響應setAge的方法愁铺,實際上是對象p的isa即NSKVONotifying_Person類的setAge方法,并不是原Person類的setAge方法机杜。
小結:當某個類的對象第一次被觀察時,系統(tǒng)就會在運行期動態(tài)地創(chuàng)建該類
的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的
setter 方法帜讲。
區(qū)別:
1.大多數(shù)情況下看個人習慣.
2.但是, 一般在層級結構比較深又需要傳值的情況,用通知比較合適.
3.代理比通知規(guī)范,非常適合多人開發(fā)以及代碼維護,還有就是當通信事件比較多時椒拗,建議使用代理似将;
4.KVO僅僅是能監(jiān)聽對象屬性的改變(靈活度不如通知和代理),比如,監(jiān)聽tableView的contentOffSet
5.block,異步和簡單的回調用block更好,例如,一些網(wǎng)絡庫,AFNetworking