委託(delegate)是一種對象,另一個類的對象會要求委派物件執行它的某些操作。
建立一個“NSObject”類別稱為建立一個非正式協議。
任何實現“NSObject”類別中的方法的類的對象都可以成為委派物件。因為在Objective-C中所有的
類都是NSObject的子類。
當你想要向委派物件發送訊息時,最好先檢查該對象是否理解你將要發送的訊息。
if ([delegate respondsToSelector: @selector(...)]
{
[delegate ...];
}
正式協議:通過在@protocol部分列出一組方法名來定義一個正式協議。通過在@interface聲明中的類名之後列出
用角括弧括起來的協議名稱,對象可以採用協議。當對象採用一個協議時,它承諾實現該協議中列出的每一個要求
實現的方法。如果你沒有實現,編譯器會提出警告,從而協助你履行承諾。
當你使用了某個協議時,最好顯示的聲明,而不僅僅是實現了協議的方法(雖然可以這麼做)。
下面這個例子中,沒有聲明採用協議FooDelegate,而只是實現了協議方法-(void)fun。這樣雖然也能工作,
但這不是一個好的編程習慣。(應把Temp的聲明改為@interface Temp:NSObject<FooDelegate>)
應該始終在類聲明時指明我們使用的協議,這能明確表達我們的意圖。這也是為什麼要有正式協議的原因,否則
非正式協議就滿足了。
/********************************************** Foo.h***********************************************/#import <Foundation/Foundation.h>@interface Foo : NSObject{ NSInteger _t;}@property NSInteger t;@property (nonatomic, strong) id delegate;-(void) notify;@end@protocol FooDelegate-(void)fun;@end/********************************************** Foo.m***********************************************/#import "Foo.h"@implementation Foo@synthesize delegate;-(void)setT:(NSInteger)newt{ self.t = newt;}-(NSInteger)t{ NSLog(@"getter"); return self.t;}-(void) notify{ NSLog(@"notify..."); if ([delegate respondsToSelector:@selector(fun)]) { [delegate fun]; }}@end/********************************************** Temp.h***********************************************/#import <Foundation/Foundation.h>@interface Temp : NSObject@end/********************************************** Temp.m***********************************************/#import "Temp.h"@implementation Temp-(void) fun{ NSLog(@"Temp fun");}@end/********************************************** main.m***********************************************/#import <Foundation/Foundation.h>#import "Foo.h"#import "Temp.h"int main (int argc, const char * argv[]){ @autoreleasepool { Foo *ob = [[Foo alloc] init]; Temp *t = [[Temp alloc] init]; ob.delegate = t; [ob notify]; } return 0;}