代理/通知/block/KVO

代理:

代理是 iOS 很常用的方式腌巾,它的特點就是一對一的形式,并且它的邏輯結(jié)構(gòu)非常的清晰铲觉。實現(xiàn)起來也是比較簡單的:
1.聲明協(xié)議澈蝙,通常是聲明協(xié)議的類名+delegate;
2.定義一個代理屬性撵幽;
3.設(shè)置代理
一般要注意以下幾個方面:

  • 協(xié)議定義時碉克,請用關(guān)鍵字@required,和@optional來明確代理是否必須實現(xiàn)某些方法
  • ** 代理的類型需要用 id 類型并齐,還要寫明要遵守的協(xié)議漏麦,同時為防止循環(huán)引用的產(chǎn)生,要用 copy 來修飾**
  • ** 在調(diào)用代理方法的時候况褪,一定要判斷代理是否實現(xiàn)了該方法撕贞,以免發(fā)生沒有實現(xiàn)該方法而導(dǎo)致程序崩潰**
  • ** 在實現(xiàn)代理方法的時候一定要遵守相應(yīng)的代理協(xié)議**

適用場景:

1.公共接口,回調(diào)方法較多也選擇用delegate進(jìn)行解耦
iOS最常用tableViewDelegate测垛,textViewDelegate
2.兩個界面之間的相互傳值捏膨,這兩個界面之間沒有多么復(fù)雜的關(guān)系,然后需要自己定義代理,設(shè)置代理屬性号涯,聲明代理方法目胡,代理方遵守協(xié)議,判斷并執(zhí)行代理方法即可


通知:

通知相比于代理來說链快,更加的簡單誉己,首先他是一對多的形式,并且可以在任意對象之間傳遞域蜗,通知其實就是在通知中心注冊通知巨双,發(fā)通知,收通知霉祸。但是使用通知的時候一定要注意以下幾點:
** 1.對于系統(tǒng)沒有定義的事件監(jiān)聽時需要自己發(fā)通知筑累,這是你就需要定義一個key,是字符串類型丝蹭,這也是通知的一個弊端慢宗,你需要拷貝到收通知的對象,避免寫錯一個字母而無法收通知的尷尬,可以定義成宏.**
** 2.使用完通知之后奔穿,一定要記得移除掉通知婆廊,如果不移除通知,不僅會影響性能巫橄,還會造成意想不到的結(jié)果淘邻。**

使用場景:

1.當(dāng)多個控制器都需要知道一個事件時,應(yīng)該使用通知湘换,比如一個事件會影響多個方法
2.想個多層的控制器之間的跳轉(zhuǎn)和傳值都需要使用通知
3.通知還可以用來監(jiān)聽鍵盤宾舅、前后臺等系統(tǒng)使用情況。


block:

block 是 C語言的彩倚,類似于 C 函數(shù)筹我,帶有局部變量的匿名函數(shù),類似 C 語言中的函數(shù)指針帆离,可以當(dāng)做參數(shù)傳來傳去蔬蕊,而且可以沒有名字。

  • 它是一種數(shù)據(jù)類型哥谷,可以當(dāng)參數(shù)傳遞
  • 說的簡單點 block 就是一組預(yù)先準(zhǔn)備好的代碼岸夯,在需要的時候執(zhí)行,無論在哪調(diào)用们妥,block 執(zhí)行都會回到 block 創(chuàng)建的地方執(zhí)行

使用場景:

異步和簡單的回調(diào)
block 最典型的就是總所周知的 AFNetworking 第三方庫

注意點:
1.當(dāng) block 作為屬性的時候要用 copy 修飾
因為防止在MRC下,如果block訪問了外部變量,那么block就會存在棧區(qū),當(dāng)Block所在的作用域結(jié)束時就會被銷毀,所以當(dāng)在別的地方回掉時可能就會出錯,為了避免這種情況就需要手動調(diào)用Block的copy方法copy到堆區(qū),這也是Block當(dāng)屬性時用copy的原因.在MRC下需要手動管理內(nèi)存(需要程序猿手動copy到堆區(qū))
2.__weak
Block還有一個注意點就是,Block會對外部使用的變量和控制器進(jìn)行強引用,為避免循環(huán)引用造成資源釋放不了,需要用weak修飾外部變量和控制器
3.__block

block內(nèi)部默認(rèn)是不能修改外部變量的值,如果要修改使用__block修飾,一旦用__block修飾了,變量的地址就變成了堆區(qū)的地址

KVO:

KVO就是“鍵值觀察”猜扮,觀察者模式,它是用來監(jiān)聽對象的屬性值的變化监婶,當(dāng)指定的被觀察的對象的屬性被修改之后旅赢,KVO 就會通過回調(diào)方法自動通知響應(yīng)的觀察者了齿桃,KVO 使用和通知極其的相似,兩者都是一對多煮盼,使用步驟:

  • 注冊觀察者短纵,指定被觀察者的屬性
  • 實現(xiàn)回調(diào)的方法
  • 移除觀察

KVO 在 Apple 中的 API 文檔如下:

Automatic key-value observing is implemented using a technique called isa-swizzling… When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class …

KVO 底層實現(xiàn)原理其實就是 runtime 機(jī)制
基本的原理:
當(dāng)觀察者對象 A ,KVO 機(jī)制動態(tài)的創(chuàng)建一個對象 A 當(dāng)前的子類僵控,并為這個新的子類重寫了被觀察者的屬性 keyPath 的 setter 方法香到。隨后 setter 方法就負(fù)責(zé)通知觀察對象屬性的改變狀況。
什么是 isa喉祭?
每個對象都有 isa 指針,指向該對象的類雷绢,它告訴 Runtime 系統(tǒng)這個對象的類是什么泛烙。所以當(dāng)對象注冊為觀察者時,isa 指針指向新子類翘紊,那么這個被觀察的對象就神奇的變成了新子類的對象蔽氨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帆疟,隨后出現(xiàn)的幾起案子鹉究,更是在濱河造成了極大的恐慌,老刑警劉巖踪宠,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件自赔,死亡現(xiàn)場離奇詭異,居然都是意外死亡柳琢,警方通過查閱死者的電腦和手機(jī)绍妨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柬脸,“玉大人他去,你說我怎么就攤上這事〉苟椋” “怎么了灾测?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垦巴。 經(jīng)常有香客問我媳搪,道長,這世上最難降的妖魔是什么骤宣? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任蛾号,我火速辦了婚禮,結(jié)果婚禮上涯雅,老公的妹妹穿的比我還像新娘鲜结。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布精刷。 她就那樣靜靜地躺著怒允,像睡著了一般纫事。 火紅的嫁衣襯著肌膚如雪丽惶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天万哪,我揣著相機(jī)與錄音抡秆,去河邊找鬼。 笑死儒士,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冲杀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼旺芽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了悯舟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤砸民,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體背亥,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡盾戴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年锐峭,在試婚紗的時候發(fā)現(xiàn)自己被綠了援雇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惫搏。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡筐赔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤滔金,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站在抛,受9級特大地震影響钟病,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刚梭,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一肠阱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朴读,春花似錦屹徘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氮唯,卻和暖如春鉴吹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惩琉。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工豆励, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞒渠。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓良蒸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伍玖。 傳聞我的和親對象是個殘疾皇子嫩痰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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