協議有兩個修飾符@optional
和@required
,建立一個協議若是沒有聲明,默認是@required
狀態的。這兩個修飾符只是約定代理是否強制須要遵照協議,若是@required
狀態的方法代理沒有遵照,會報一個黃色的警告,只是起一個約束的做用,沒有其餘功能web
在iOS2.0
以前尚未引入@Protocol
正式協議以前,實現協議的功能主要是經過給NSObject
添加Category
的方式。這種經過Category
的方式,相對於iOS2.0
以後引入的@Protocol
,就叫作非正式協議。安全
通常都是使用weak修飾, 咱們定義的指針默認都是__strong
類型的,strong
類型的指針會形成強引用,一定會影響一個對象的生命週期,這也就會造成循環引用。weak
和assign
是一種「非擁有關係」的指針,經過這兩種修飾符修飾的指針變量,都不會改變被引用對象的引用計數。在一個對象被釋放後,weak
會自動將指針指向nil
,而assign
則不會,因此weak更安全。性能
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