天天看點

委托+協定的例子(附DEMO 下載下傳位址)

寫一些關于委托和協定的demo給大家參考。委托和協定最大的用處就是,比如我是老闆,我有那麼多項目,可是 我沒有去實作他,我需要委托我手下的程式員去完成那些代碼。同僚呢,程式員,也可以把他需要回報的資訊送出給老闆,或者讓老闆也幫程式員做事情,兩個人之間是可以互相利用的。這就是委托加協定的精髓吧,就其本質而言,我覺得委托是一個C語言裡面指向指針的指針函數的概念。而協定呢,是一個抽象起來的概念。

例子:http://www.kuaipan.cn/file/id_27084742373409805.htm       通路密碼: xCFDXf

協定聲明程式設計接口,任何類都可選擇實作此程式設計接口。通過協定,兩個在繼承上沒有關聯的類可以互相通訊,協作實作某種目标。從這個角度來說,協定為子類化提供了替代選擇。如果一個類提供某種服務,則它可以聲明一個程式設計接口,以此來對外提供匿名服務。其他希望使用服務類需要采納該協定,并實作協定的一個或者多個方法。聲明協定類将會調用協定采納者實作的方法(協定中的方法)。

委托+協定的例子(附DEMO 下載下傳位址)

正式和非正式協定

協定有兩種類型—正式協定和非正式協定:

  • 非正式協定是

    NSObject

    類的範疇類(範疇類是語言特征。通過它,您無需子類化就向某個類增加方法),這意味着幾乎所有的對象都是非正式協定的采納者。非正式協定中的方法不必全部實作。在調用某個方法之前,調用對象會先檢查目标對象是否實作此方法。在可選協定方法被引入Objective-C 2.0之前,非正式協定實質上是Foundation和AppKit 類用于實作委托的方式。
  • 正式協定聲明一個方法清單,協定采納者需要實作表中所有方法。正式協定有特殊的聲明、采納以及類型檢查文法。您可以使用

    @required

    @optional

    關鍵字指定方法必須實作或可選實作。子類将會繼承其祖先類所采用的正式協定。一個正式協定也可以采納其他的協定。

    正式協定是對Objective-C語言的擴充。

采納和遵循正式協定

一個類可以聲明自己采納的正式協定,也可以從超類繼承。我們在類的

@interface

聲明中使用尖括号來表示采納協定。在下面的例子中,

CAAnimation

聲明自己的超類是

NSObject

,并且正式采納三種協定。

@interface CAAnimation : NSObject <NSCopying, CAMediaTiming, CAAction>      

如果一個類采納某個協定或者這個類的祖先類采納某個協定,我們說這個類—以及該類的任意執行個體—遵循某個協定。遵循某個協定也意味着這個類将實作協定中所有必須實作的方法。通過在運作時向對象發送

conformsToProtocol:

消息可以判斷它是否遵循某個協定。

以下是來自蘋果官方的叙述

委托是一種簡單而強大的模式。在此模式中,程式中的一個對象代表另外一個對象執行某個動作,或者與之互相協作共同完成某個任務。釋出委托的對象持有其他對象(委托)的引用。在适當的時候,它會向委托發送消息。消息用于通知委托對象釋出委托的對象将要處理或者已經處理某個事件。作為響應,委托對象會更新外觀或者更新自身或應用程式其他對象的狀态。在某些情況下,委托對象也可以傳回一個值,通過它來影響事件(即将被處理的事件)的處理方式。通過委托,我們可以以某個對象為中心,輕松定制周圍的數個對象。

委托和Cocoa架構

通常情況下,釋出委托的是架構對象,委托是定制的控制器對象 。釋出委托對象持有委托的弱引用。Foundation、UIKit、AppKit以及其他的Cocoa及Cocoa Touch架構有很多地方使用委托。

在AppKit 架構中,

NSWindow

類的執行個體是一個釋出委托的對象。 

NSWindow

聲明一個協定,

windowShouldClose:

是協定的一個方法。當使用者點選某個視窗關閉框時,視窗對象向委托發送

windowShouldClose:

消息,要求它确認視窗是否關閉。委托則傳回一個Boolean類型值,通過該值控制視窗對象的行為。

委托+協定的例子(附DEMO 下載下傳位址)

委托和通知

大部分Cocoa架構類的委托都自動注冊為釋出委托對象所發通知的觀察者 。委托隻需實作架構類聲明的某個通知方法,以此接收特定的通知。仍以上述例子進行說明,視窗對象向觀察者發送

NSWindowWillCloseNotification

消息,但是向委托發送 

windowShouldClose:

消息。

資料源

資料源幾乎等同于委托,不同之處在于它同釋出委托對象的關系。釋出委托對象并不把對于使用者界面的控制轉交給它,而是把資料控制交給它。釋出委托對象,通常是諸如表視圖這樣的視圖對象。它持有資料源引用,并時不時向其索要待顯示資料。資料源和委托一樣,也必須遵循某種協定并至少實作協定所要求的方法。資料源負責管理模型對象的記憶體,并将其提供給釋出委托的視圖。

協定聲明程式設計接口,任何類都可選擇實作此程式設計接口。通過協定,兩個在繼承上沒有關聯的類可以互相通訊,協作實作某種目标。從這個角度來說,協定為子類化提供了替代選擇。如果一個類提供某種服務,則它可以聲明一個程式設計接口,以此來對外提供匿名服務。其他希望使用服務類需要采納該協定,并實作協定的一個或者多個方法。聲明協定類将會調用協定采納者實作的方法(協定中的方法)。

委托+協定的例子(附DEMO 下載下傳位址)

正式和非正式協定

協定有兩種類型—正式協定和非正式協定:

  • 非正式協定是

    NSObject

    類的範疇類(範疇類是語言特征。通過它,您無需子類化就向某個類增加方法),這意味着幾乎所有的對象都是非正式協定的采納者。非正式協定中的方法不必全部實作。在調用某個方法之前,調用對象會先檢查目标對象是否實作此方法。在可選協定方法被引入Objective-C 2.0之前,非正式協定實質上是Foundation和AppKit 類用于實作委托的方式。
  • 正式協定聲明一個方法清單,協定采納者需要實作表中所有方法。正式協定有特殊的聲明、采納以及類型檢查文法。您可以使用

    @required

    @optional

    關鍵字指定方法必須實作或可選實作。子類将會繼承其祖先類所采用的正式協定。一個正式協定也可以采納其他的協定。

    正式協定是對Objective-C語言的擴充。

采納和遵循正式協定

一個類可以聲明自己采納的正式協定,也可以從超類繼承。我們在類的

@interface

聲明中使用尖括号來表示采納協定。在下面的例子中,

CAAnimation

聲明自己的超類是

NSObject

,并且正式采納三種協定。

@interface CAAnimation : NSObject <NSCopying, CAMediaTiming, CAAction>      

如果一個類采納某個協定或者這個類的祖先類采納某個協定,我們說這個類—以及該類的任意執行個體—遵循某個協定。遵循某個協定也意味着這個類将實作協定中所有必須實作的方法。通過在運作時向對象發送

conformsToProtocol:

消息可以判斷它是否遵循某個協定。