標籤:
原文:http://blog.csdn.net/dqjyong/article/details/7685898
委託delegation的介紹:
委託delegation是一種簡單但是功能強大的設計模式,它的功能是程式中一個對象代表另一個對象,或者一個對象與另外一個對象協同工作。委派物件保留了另外一個對象的引用,即就是委託,以及在合適的時候發送訊息給委託。訊息通知事件的委託方法,委派物件將要處理或已經處理。委託可能通過更新本身或者本應用的其他對象的狀態或者外觀來對訊息進行響應,在某些情況下委託也可能傳回值,從而影響即將發生事件的處理方式。委託模式的主要價值是讓你通過一個中心對象,簡單的自訂某些對象的行為。
委託與Cocoa 平台:
委派物件是典型的一種平台對象,而且委託是典型的一種自訂的控制器對象。在一個通過管理的記憶體環境中,委派物件保留了它的委託的弱引用,而在記憶體回收的環境中,接收者即委派物件保留它的委託的強引用。委託delegation的例子廣泛存在於Foundation, UIKit, AppKit, 以及其他的r Cocoa 和 Cocoa Touch平台上。
以AppKit平台上NSWindow類的執行個體來作為委派物件為例。NSWindow類聲明了協議,協議包含了windowShouldClose:方法。當使用者點擊了表單的關閉按鈕,那麼表單對象就發送windowShouldClose:給它的委託,並請求委託來關閉表單。委託將返回一個布爾值,用來控制表單對象的行為。
下面講一下在ios 中如何使用delegate:
首先,聲明delegate。例如:
//返回使用者輸入的委託
@protocol EnterDelegate <NSObject>
@required//這個可以是required,也可以是optional
-(void)Entered:(NSInteger)amount;
@end
在委託的聲明中,我們只定義了一個方法,它將給rootViewController返回從使用者輸入獲得的一個NSInteger對象。
其次,在rootViewController中定義一個委派物件。如下代碼:
@interface EnterViewController : UIViewController {
IBOutlet UITextField *InputTextField;
id < EnterDelegate > delegate;
}
-(IBAction)cancel
-(IBAction)save;
@property(nonatomic,assign)id delegate;
@end
上面的代碼中“id < EnterDelegate > delegate”聲明了id對象,並指向已經定義的delegate的引用。那麼我們需要為該id對象添加一些屬性,從而讓EnterViewController能夠訪問它。
接下來,實現委託方法。因為delegate Entered:方法是必須的,所以需要實現該方法。
-(void)Entered:(NSInteger)amount
{
InputLabel.text = [NSString stringWithFormat:@"%i" , amount];
}
最後,完成委派物件給委託發送訊息。即在EnterViewController的實現檔案.m中完成上面定義的一些方法。
-(IBAction)savePressed
{
//確定委託是否存在Entered方法
if([delegate respondsToSelector:@selector(Entered:)])
{
//發送委託方法,方法的參數為使用者的輸入
[delegate Entered:[InputTextField.text intValue]];
}
[self dismissModalViewControllerAnimated:YES];
}
savePressed方法與工具列中的儲存按鈕相聯絡。當使用者完成了數字輸入以及點擊了儲存,即觸發該方法。
====================================================
上面的過程就是如何使用委託的過程,雖然功能是很簡單的。
從委託方法的實現來看,委託方法的實現是在另外一個類中完成,即委託類的內部暴露了,與我們一般堅持的隱藏實現原則相違背。
從委託類的定義可以看出,委託與協議有一定的相似性。都採用protocol關鍵字來聲明
,並且其中的方法都有optional和required,都需要對required方法和調用的optional方法進行實現。而不同的是在委派物件所在的類中需要定義一個delegate對象,並且為id類型。
但是delegate與protocol沒有關係。Delegate本身應該稱為一種設計模式,是把一個類自己需要做的一部分事情,讓另一個類(也可以就是自己本身)來完成,而實際做事的類為delegate。而protocol是一種文法,它的主要目標是提供介面給遵守協議的類使用,而這種方式提供了一個很方便的、實現delegate模式的機會。
iOS 徹底學會使用delegate