代理/通知/block/KVO

代理:

第一就是代理,這也是很常用的方式,特點是一對一的形式蛋欣,而且邏輯結構非常清晰。實現(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和通知有點相似,使用步驟:

  1. 注冊,指定被觀察者的屬性,
  2. 實現(xiàn)回調方法
  3. 移除觀察
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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚀苛,隨后出現(xiàn)的幾起案子在验,更是在濱河造成了極大的恐慌,老刑警劉巖堵未,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腋舌,死亡現(xiàn)場離奇詭異,居然都是意外死亡渗蟹,警方通過查閱死者的電腦和手機块饺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雌芽,“玉大人授艰,你說我怎么就攤上這事∈缆洌” “怎么了淮腾?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谷朝。 經(jīng)常有香客問我,道長武花,這世上最難降的妖魔是什么圆凰? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮髓堪,結果婚禮上送朱,老公的妹妹穿的比我還像新娘娘荡。我一直安慰自己,他們只是感情好驶沼,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布炮沐。 她就那樣靜靜地躺著,像睡著了一般回怜。 火紅的嫁衣襯著肌膚如雪大年。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天玉雾,我揣著相機與錄音翔试,去河邊找鬼。 笑死复旬,一個胖子當著我的面吹牛垦缅,可吹牛的內容都是我干的。 我是一名探鬼主播驹碍,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼壁涎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了志秃?” 一聲冷哼從身側響起怔球,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浮还,沒想到半個月后竟坛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡钧舌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年担汤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洼冻。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡漫试,死狀恐怖,靈堂內的尸體忽然破棺而出碘赖,到底是詐尸還是另有隱情,我是刑警寧澤外构,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布普泡,位于F島的核電站,受9級特大地震影響审编,放射性物質發(fā)生泄漏撼班。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一垒酬、第九天 我趴在偏房一處隱蔽的房頂上張望砰嘁。 院中可真熱鬧件炉,春花似錦、人聲如沸矮湘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缅阳。三九已至磕蛇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間十办,已是汗流浹背秀撇。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留向族,地道東北人呵燕。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像件相,于是被迫代替她去往敵國和親再扭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容