Protocol, Delegate

協議的構成:

  • 協議:用來指定代理雙方能夠作什麼,必須作什麼。
  • 代理:根據指定的協議,完成委託方須要實現的功能。
  • 委託:根據指定的協議,指定代理去完成什麼功能。

協議的修飾符:

協議有兩個修飾符@optional@required,建立一個協議若是沒有聲明,默認是@required狀態的。這兩個修飾符只是約定代理是否強制須要遵照協議,若是@required狀態的方法代理沒有遵照,會報一個黃色的警告,只是起一個約束的做用,沒有其餘功能web


非正式協議:

iOS2.0以前尚未引入@Protocol正式協議以前,實現協議的功能主要是經過給NSObject添加Category的方式。這種經過Category的方式,相對於iOS2.0以後引入的@Protocol,就叫作非正式協議。安全


Delegate修飾符:

通常都是使用weak修飾, 咱們定義的指針默認都是__strong類型的,strong類型的指針會形成強引用,一定會影響一個對象的生命週期,這也就會造成循環引用。
weakassign是一種「非擁有關係」的指針,經過這兩種修飾符修飾的指針變量,都不會改變被引用對象的引用計數。在一個對象被釋放後,weak會自動將指針指向nil,而assign則不會,因此weak更安全。性能

Delegate和Block選擇:

1.若是對象有超過一個以上不一樣的事件源,使用delegate
註解:用block解決多個事件源有兩種方法 1. 爲每一個事件源寫相應的block,這顯然是不合理的 2.寫一個能夠接受任何事件的block,這種寫法不簡單且不宜讀;ui

2.一個對象只有一個delegate,因此單例對象不要使用delegate。spa

註解:能夠想象CLLocationManager是個單例對象,當地理位置變化的時候,須要不停的切換delegate指針到所須要數據的這個單例對象上去,顯然是不合理的代理

3.delegate面向的是過程,block面向的是結果
在delegate的數據源和代理方法中咱們老是能看到,一系列的過程方法好比,我將要作什麼(如:willSendRequest,將要發送請求)、到目前爲止我知道的信息(如:canAuthenticateAgainstProtectionSpace)、我已經完成這些啦(didReceiveResponse,收到請求的回覆,即完成請求)而block只是一個請求結果,並知道請求是否成功,面向結果的一個過程指針

4,從性能上來講,block的性能消耗要略大於delegate
由於block會涉及到棧區向堆區拷貝等操做,時間和空間上的消耗都大於代理。而代理只是定義了一個方法列表,在遵照協議對象的objc_protocol_list中添加一個節點,在運行時向遵照協議的對象發送消息便可。code

相關文章
相關標籤/搜索