iOS開發:delegate、notification、KVO的選擇

發布時間:2017-04-15 17:03 來源:互聯網 當前欄目:電腦編程入門

   delegate、notification和KVO的功能比較類似,那么在實際的編程中,如何選擇這些方式呢?

  在開發ios應用的時候,我們會經常遇到一個常見的問題:在不過分耦合的前提下,controllers間怎么進行通信。在IOS應用不斷的出現三種模式來實現這種通信:

  1.委托delegation;

  2.通知中心Notification Center;

  3.鍵值觀察key value observing,KVO

  因此,那為什么我們需要這些模式以及什么時候用它以及什么時候不用它。

  下面完全根據我的開發經驗來討論這三中模式。我將討論為什么我覺得某種模式要好于另外一種模式以及為什么我覺得在一定的環境下某中模式比較好。我給出的這 些原因并不是圣經,而僅僅是個人觀點。如果你有什么不同的觀點或者還可以進行補充的地方,可以聯系我,一起討論。

  上面的三種模式是什么?

  三種模式都是一個對象傳遞事件給另外一個對象,并且不要他們有耦合。三種模式都是對象來通知某個事件發生了的方法,或者更準確的說,是允許其他的對象收到 這種事件的方法。這對于一個對象來說,是非常普通而且必須做的任務,因為沒有通信,controllers將不能整合到整個應用中。controller 的另外一個目的是盡可能的自包含。我們希望controllers以自己的方式存在,在controllers層面上不能與其他的controllers 進行耦合。Controllers能夠穿件其他的controllers而且他們之間可以自由通信,但是我們不希望controller又回接到創建自己 的controller。如果我們耦合了他們,那么我們將不能復用他們,以及完全失去對應用中一個獨立的組件的控制。

  這三種模式給controllers(也可以是其他的對象)提供通信的方法。下面將描述如何在ios應用中使用這些模式,同樣需要注意的他們在其他的地方也會用到,并且確實是存在。

  delegation

  當我們第一次編寫ios應用時,我們注意到不斷的在使用“delegate”,并且貫穿于整個SDK。delegation模式不是IOS特有的模式,而是依賴與你過去擁有的編程背景。針對它的優勢以及為什么經常使用到,這種模式可能不是很明顯的。

  delegation的基本特征是,一個controller定義了一個協議(即一系列的方法定義)。該協議描述了一個delegate對象為了能夠響應 一個controller的事件而必須做的事情。協議就是delegator說,“如果你想作為我的delegate,那么你就必須實現這些方法”。實現 這些方法就是允許controller在它的delegate能夠調用這些方法,而它的delegate知道什么時候調用哪種方法。delegate可以 是任何一種對象類型,因此controller不會與某種對象進行耦合,但是當該對象嘗試告訴委托事情時,該對象能確定delegate將響應。

  delegate的優勢:

  1.非常嚴格的語法。所有將聽到的事件必須是在delegate協議中有清晰的定義。

  2.如果delegate中的一個方法沒有實現那么就會出現編譯警告/錯誤

  3.協議必須在controller的作用域范圍內定義

  4.在一個應用中的控制流程是可跟蹤的并且是可識別的;

  5.在一個控制器中可以定義定義多個不同的協議,每個協議有不同的delegates

  6.沒有第三方對象要求保持/監視通信過程。

  7.能夠接收調用的協議方法的返回值。這意味著delegate能夠提供反饋信息給controller

  缺點:

  1.需要定義很多代碼:1.協議定義;2.controller的delegate屬性;3.在delegate本身中實現delegate方法定義

  2.在釋放代理對象時,需要小心的將delegate改為nil。一旦設定失敗,那么調用釋放對象的方法將會出現內存crash

  3.在一個controller中有多個delegate對象,并且delegate是遵守同一個協議,但還是很難告訴多個對象同一個事件,不過有可能。

  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、