歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Objective-C的委托機制【附代碼】

委托在IOS開發框架Cocoa Touch 中經常使用,其含義是一個類的對象要求委托對象執行它的某些操作。委托機制實際是種設計模式,通過此種機制,能降低對象間的耦合。還是不繼續說概念了,直接上定義代碼。

//環境

//Mac OS X 10.3.7

//Xcode Version 4.2.1

//使用的是Xcode的Command Line Tool工程,結果由命令行輸出

  1. @interface MyFrameWork : NSObject{  
  2. }  
  3. @property (nonatomic,assign)NSObject * delegate;//委托對象的指針,類型為NSObject,即一切objective-c類的父類   
  4. - (id)init;  
  5. - (void) callDelegate;  
  6. @end  
  1. #import "MyFrameWork.h"   
  2.   
  3. @implementation MyFrameWork  
  4. @synthesize delegate;  
  5.   
  6. - (NSString *) description{  
  7.     return (@"I am MyFrameWork");  
  8. }  
  9. -(id) init{  
  10.     self = [super init];  
  11.     if (self){  
  12.    
  13.     }  
  14.     return  self;      
  15. }  
  16. -(void)callDelegate{  
  17.     //通過delegate指針訪問類Delegate的description方法   
  18.     NSString *string = [self.delegate description];  
  19.     //發現在最新版的編譯器裡面NSLog為了安全(支持ARC),只接受格式化的字符串,因為NSLog底層也是用printf來格式化輸出的。   
  20.     //NSLog(str);                          // warning   
  21.     // NSLog(@"%@", str);         // solution   
  22.     // NSLog(str, nil);                   // solution   
  23.     NSLog(string,nil);  
  24.   
  25. }  
  26.  
  27. @interface Delegate : NSObject  
  28. @property NSInteger number;  
  29. -(id)init;  
  30. @end
  31. #import "Delegate.h"  
  32. @implementation Delegate  
  33. @synthesize number;  
  34. -(NSString *)description{  
  35.     self.number = self.number + 1;  
  36.     NSString *string = [[NSString alloc] initWithFormat:@"I am Delegate,%ld calls",self.number];  
  37.     return (string);  
  38. }  
  39. -(id)init{  
  40.     self = [super self ];  
  41.     if (self) {  
  42.         self.number =0;  
  43.     }  
  44.     return self;  
  45. }  
  46. @end

首先定義了兩個類,MyFrameWork類通過Delegate類完成訪問Delegate的description方法。很簡單便完成了委托,這也跟objective-c面向對象和靈活的特點相穩合,如果熟悉C++的童鞋,就會發現上述同樣的功能的比較難完成,C++沒有共同的父類,所以不存在一個指針可以指向任意的委托對象,這似乎是個不可解決的問題。但C++中有類的成員函數指針這一概念,具體的實現可以看一下 http://www.linuxidc.com/Linux/2012-08/68654.htm 這篇,多參數時實現的很巧妙。總之objective-c委托實現很簡單(大家不許偷笑),但很少會像上面的列子使用,一般應用到框架上,還會同時帶上協議,例如: 

 

上圖為使用Core Location框架(移動設備定位)中,類及協議組成的委托。
Copyright © Linux教程網 All Rights Reserved