iOS中常用的幾種傳值方式

1. 通知 (NSNotification) ()

定義: 消息的發送者告知接受者事件將要發送或者已經發生,接收者不能反過來影響發送者的行爲(發送者不關心接受者的態度,我只管負責發送,你接不接受是裏的事情,往往用到did這個詞).

使用流程: (1)註冊通知中心(NSNotificationCenter); (2)程序運行時接收通知.

使用時機: 主要用於1對多情況下的通信, 對象之間不需要建立關係. 例如多線程之間的傳值.

注意: 代碼可讀性差 . 

與KVO的區別: 可以檢測的內容比較多, 但是需要被觀察者手動發送通知, 觀察者才能響頻,


2. 代理 (delegate) (屬性用assign)

定義: 又稱爲 委託或代理, 是一種設計模式,主要用於兩個對象之間的通信交互,解除兩個對象之間的耦合性, 主要用於視圖和使用對象之          間的通信.  接受者可以改變發送者的行爲(需要關注返回值, 比如你是我的代理, 我想做某件事你願意嗎?你需要給我一個答案,我根據你的答案做下一步安排,往往用到should這個詞).

使用流程: 需要定義協議方法,代理簽署協議,實現協議方法;

使用時機: 用於兩個對象之間1對1的通信, 如果通信事件比較多的話,建議使用delegate;

注意: delegate 比 通知效率高.


3. Block

定義: 閉包, 能夠讀取其他函數內部變量的匿名函數.

實現原理: block實際上是指向結構體的指針, 編譯器會將block的內部代碼生成對應的函數.

使用流程: 比協議簡潔,不需要定義繁瑣的協議,

使用時機: 用於兩個對象之間1對1的通信, 適用於只回調一次的簡單任務.

注意: 內存管理: 在ARC環境下使用__block修飾變量, 在MRC環境下使用__weak修飾變量, 在block中不能直接使用self.(需要先將self賦值給一個臨時變量) , 因爲self會持有這個對象,引起循環引用; 

與函數的區別: 與C裏面的函數類似, 都可以作爲參數進行傳遞,用於回調. 但block的實現可以定義在方法中(可以訪問方法中的局部變量,使代碼更加緊湊,結構化),函數則不可以.


4. KVO (觀察)

定義: 鍵值觀察,被觀察的對象必須使用KVC鍵值編碼來修改它的實例變量, 這樣才能被觀察者觀察到,因此可以說KVO是建立在KVC的            基礎之上的.

實現原理: KVO的內部實現是基於runtime的, 重寫一個setter方法, 實現真正的通知機制.

使用流程: (1) 需要在接收通知的地方註冊觀察者; (2) 被觀察的key發生變化時,發送通知.

使用時機: 當需要檢測某一對象的屬性值的變化時

與NSNotification的區別: 只能檢測屬性的變化, 但是實現了自動檢測, 當屬性值變化時會自動通知觀察者,不用在添加代碼了.


5.單例傳值

使用時機: 當一個類在全局中只需要一個對象時,使用單例能包裝整個程序中的數據都是一樣的

具體見上一篇文章:http://blog.csdn.net/cheng_xiaocheng/article/details/49704107


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章