委托在IOS開發框架Cocoa Touch 中經常使用,其含義是一個類的對象要求委托對象執行它的某些操作。委托機制實際是種設計模式,通過此種機制,能降低對象間的耦合。還是不繼續說概念了,直接上定義代碼。
//環境
//Mac OS X 10.3.7
//Xcode Version 4.2.1
//使用的是Xcode的Command Line Tool工程,結果由命令行輸出
- @interface MyFrameWork : NSObject{
- }
- @property (nonatomic,assign)NSObject * delegate;//委托對象的指針,類型為NSObject,即一切objective-c類的父類
- - (id)init;
- - (void) callDelegate;
- @end
- #import "MyFrameWork.h"
-
- @implementation MyFrameWork
- @synthesize delegate;
-
- - (NSString *) description{
- return (@"I am MyFrameWork");
- }
- -(id) init{
- self = [super init];
- if (self){
-
- }
- return self;
- }
- -(void)callDelegate{
- //通過delegate指針訪問類Delegate的description方法
- NSString *string = [self.delegate description];
- //發現在最新版的編譯器裡面NSLog為了安全(支持ARC),只接受格式化的字符串,因為NSLog底層也是用printf來格式化輸出的。
- //NSLog(str); // warning
- // NSLog(@"%@", str); // solution
- // NSLog(str, nil); // solution
- NSLog(string,nil);
-
- }
-
- @interface Delegate : NSObject
- @property NSInteger number;
- -(id)init;
- @end
- #import "Delegate.h"
- @implementation Delegate
- @synthesize number;
- -(NSString *)description{
- self.number = self.number + 1;
- NSString *string = [[NSString alloc] initWithFormat:@"I am Delegate,%ld calls",self.number];
- return (string);
- }
- -(id)init{
- self = [super self ];
- if (self) {
- self.number =0;
- }
- return self;
- }
- @end
首先定義了兩個類,MyFrameWork類通過Delegate類完成訪問Delegate的description方法。很簡單便完成了委托,這也跟objective-c面向對象和靈活的特點相穩合,如果熟悉C++的童鞋,就會發現上述同樣的功能的比較難完成,C++沒有共同的父類,所以不存在一個指針可以指向任意的委托對象,這似乎是個不可解決的問題。但C++中有類的成員函數指針這一概念,具體的實現可以看一下 http://www.linuxidc.com/Linux/2012-08/68654.htm 這篇,多參數時實現的很巧妙。總之objective-c委托實現很簡單(大家不許偷笑),但很少會像上面的列子使用,一般應用到框架上,還會同時帶上協議,例如:
上圖為使用Core Location框架(移動設備定位)中,類及協議組成的委托。