0x01 什麼是委托
Cocoa中的類經常使用一種名為委托(delegate)的技術。
委托是一種對象,另一個類的對象會要求委托對象執行它的某些操作。
0x02 委托和類别
委托+類别的一種應用:建立一個非正式協定。
通過建立非正式協定,将一些方法聲明為NSObject的類别,方法的實作可以發送給任何對象,無論這些對象實際上屬于哪一個類。
這也意味着,隻要一個類添加了這個NSObject類别的頭檔案,這個對象就成為了一個委托對象,可以調用類别中聲明的方法。
0x03 委托示例
首先,我們要建立一個以NSObject為根類的類别:
Xcode自動生成類别的.h和.m檔案:
然後,在類别的接口中,聲明了示例方法example_method:
//NSObject+Delegate.h
#import <Foundation/Foundation.h>
@interface NSObject (Delegate)
-(NSString *) example_method;
@end
類别的實作中,把example_method:方法實作:
//NSObject+Delegate.m
#import "NSObject+Delegate.h"
@implementation NSObject (Delegate)
-(NSString *) example_method{
NSLog(@"I am B.");
NSLog(@"And A tell me:");
NSString *string = @"Delegate+Category called Informal Protocol.";
return string;
}
@end
接着,我們要建立一個新的類Test,這個Test類将委托類别Delegate幫自身完成工作。
Test類的接口如下:
#import <Foundation/Foundation.h>
@interface Test : NSObject
-(NSString *) test_method;
@end
Test類的實作如下:
#import "Test.h"
#import "NSObject+Delegate.h"
@implementation Test
NSString *test_str;
-(NSString *) test_method{
NSLog(@"I am A, and I order B to do something.");
//調用NSObject類别中的方法
NSString *str = [NSString stringWithFormat:@"%@",[self example_method]];
return str;
}
@end
最後,寫一個main函數輸出委托示例:
#import <Foundation/Foundation.h>
#import "Test.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Test *test = [[Test alloc] init]; //記得給Test類配置設定空間并初始化
//委托示例
//Test類通過調用自身的test_method:方法,去調用NSObject類别中的方法
NSLog(@"%@",test.test_method);
NSLog(@"%s","Delegate Completed.");
}
return 0;
}
//Output:
//Delegate_Test[2870:53058] I am A, and I order B to do something.
//Delegate_Test[2870:53058] I am B.
//Delegate_Test[2870:53058] And A tell me:
//Delegate_Test[2870:53058] Delegate+Category called Informal Protocol.
//Delegate_Test[2870:53058] Delegate Completed.
//Program ended with exit code: 0
0x04 總結
要實作委托效果,在Objective-C中最要的是,類必須遵循某個正式或非正式的協定,然後把自己的self指針指派給委托。