委托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模式的機會