代理:
代理是 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 指針指向新子類翘紊,那么這個被觀察的對象就神奇的變成了新子類的對象蔽氨。