委托delegation的介紹:
委托delegation是一種簡單但是功能強大的設(shè)計模式,它的功能是程序中一個對象代表另一個對象,或者一個對象與另外一個對象協(xié)同工作。委托 對象保留了另外一個對象的引用,即就是委托,以及在合適的時候發(fā)送消息給委托。消息通知事件的委托方法,委托對象將要處理或已經(jīng)處理。委托可能通過更新本 身或者本應(yīng)用的其他對象的狀態(tài)或者外觀來對消息進(jìn)行響應(yīng),在某些情況下委托也可能返回值,從而影響即將發(fā)生事件的處理方式。委托模式的主要價值是讓你通過 一個中心對象,簡單的自定義某些對象的行為。
委托與Cocoa 平臺:
委托對象是典型的一種平臺對象,而且委托是典型的一種自定義的控制器對象。在一個通過管理的內(nèi)存環(huán)境中,委托對象保留了它的委托的弱引用,而在垃圾回收的環(huán)境中,接收者即委托對象保留它的委托的強引用。委托delegation的例子廣泛存在于Foundation, UIKit, AppKit, 以及其他的r Cocoa 和 Cocoa Touch平臺上。
以AppKit平臺上NSWindow類的實例來作為委托對象為例。NSWindow類聲明了協(xié)議,協(xié)議包含了windowShouldClose:
方法。當(dāng)用戶點擊了窗體的關(guān)閉按鈕,那么窗體對象就發(fā)送windowShouldClose:
給它的委托,并請求委托來關(guān)閉窗體。委托將返回一個布爾值,用來控制窗體對象的行為。
下面講一下在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對象,并指向已經(jīng)定義的delegate的引用。那么我們需要為該id對象添加一些屬性,從而讓EnterViewController能夠訪問它。
接下來,實現(xiàn)委托方法。因為delegate Entered:方法是必須的,所以需要實現(xiàn)該方法。
-(void)Entered:(NSInteger)amount{
InputLabel.text = [NSString stringWithFormat:@"%i" , amount];
}
最后,完成委托對象給委托發(fā)送消息。即在EnterViewController的實現(xiàn)文件.m中完成上面定義的一些方法。
-(IBAction)savePressed{
//確定委托是否存在Entered方法
if([delegate respondsToSelector:@selector(Entered:)])
{
//發(fā)送委托方法,方法的參數(shù)為用戶的輸入
[delegate Entered:[InputTextField.text intValue]];
}
[self dismissModalViewControllerAnimated:YES];
}
savePressed方法與工具欄中的保存按鈕相聯(lián)系。當(dāng)用戶完成了數(shù)字輸入以及點擊了保存,即觸發(fā)該方法。
上面的過程就是如何使用委托的過程,雖然功能是很簡單的。
從委托方法的實現(xiàn)來看,委托方法的實現(xiàn)是在另外一個類中完成,即委托類的內(nèi)部暴露了,與我們一般堅持的隱藏實現(xiàn)原則相違背。
從委托類的定義可以看出,委托與協(xié)議有一定的相似性。都采用protocol關(guān)鍵字來聲明
,并且其中的方法都有optional和required,都需要對required方法和調(diào)用的optional方法進(jìn)行實現(xiàn)。而不同的是在委托對象所在的類中需要定義一個delegate對象,并且為id類型。
但是delegate與protocol沒有關(guān)系。Delegate本身應(yīng)該稱為一種設(shè)計模式,是把一個類自己需要做的一部分事情,讓另一個類(也可以就是自己本身)來完成,而實際做事的類為delegate。而protocol是一種語法,它的主要目標(biāo)是提供接口給遵守協(xié)議的類使用,而這種方式提供了一個很方便的、實現(xiàn)delegate模式的機會