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++中有类的成员函数指针这一概念,具体的实现可以看一下  这篇,多参数时实现的很巧妙。总之objective-c委托实现很简单(大家不许偷笑),但很少会像上面的列子使用,一般应用到框架上,还会同时带上协议,例如: 

 

上图为使用Core Location框架(移动设备定位)中,类及协议组成的委托。
  • 1
  • 2
  • 下一页
【内容导航】
第1页:一 第2页:二

相关内容