从C++到objective-C----委托

来源:互联网 发布:阿里云解析域名过程 编辑:程序博客网 时间:2024/05/21 10:53

http://blog.csdn.net/xunyn/article/details/7563151


制实际是种设计模式,通过此种机制,能降低对象间的耦合。一上为概念描述。

本文 主要介绍的是Objective-C中的NSObject基类,是片初学者理解id类型的入门文章,

熟悉Objective-C的课直接阅读 iOS设计模式--委托模式


//环境

//Mac OS X 10.3.7

//Xcode Version 4.2.1

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

代码(点这里下载)

[cpp] view plaincopyprint?
  1. @interface MyFrameWork : NSObject{  
  2. }  
  3. @property (nonatomic,assign)NSObject * delegate;//委托对象的指针,类型为NSObject,即一切objective-c类的父类  
  4. - (id)init;  
  5. - (void) callDelegate;  
  6. @end  


[cpp] view plaincopyprint?
  1. #import "MyFrameWork.h"  
  2. @implementation MyFrameWork  
  3. @synthesize delegate;  
  4.   
  5. - (NSString *) description{  
  6.     return (@"I am MyFrameWork");  
  7. }  
  8. -(id) init{  
  9.     self = [super init];  
  10.     if (self){  
  11.    
  12.     }  
  13.     return  self;      
  14. }  
  15. -(void)callDelegate{  
  16.     //通过delegate指针访问类Delegate的description方法  
  17.     NSString *string = [self.delegate description];  
  18.     //发现在最新版的编译器里面NSLog为了安全(支持ARC),只接受格式化的字符串,因为NSLog底层也是用printf来格式化输出的。  
  19.     //NSLog(str);                          // warning  
  20.     // NSLog(@"%@", str);         // solution  
  21.     // NSLog(str, nil);                   // solution  
  22.     NSLog(string,nil);  
  23. }  

[cpp] view plaincopyprint?
  1. @interface Delegate : NSObject  
  2. @property NSInteger number;  
  3. -(id)init;  
  4. @end  
  5. #import "Delegate.h"  
  6. @implementation Delegate  
  7. @synthesize number;  
  8. -(NSString *)description{  
  9.     self.number = self.number + 1;  
  10.     NSString *string = [[NSString alloc] initWithFormat:@"I am Delegate,%ld calls",self.number];  
  11.     return (string);  
  12. }  
  13. -(id)init{  
  14.     self = [super self ];  
  15.     if (self) {  
  16.         self.number =0;  
  17.     }  
  18.     return self;  
  19. }  
  20. @end  

       首先定义了两个类,MyFrameWork类通过Delegate类完成访问Delegate的description方法。从这里看出objective-c的纯面向对象性,如果熟悉C++的童鞋,就会发现上述同样的功能的比较难完成,C++没有共同的父类,所以不存在一个指针可以指向任意的委托对象,这似乎是个不可解决的问题。但C++中有类的成员函数指针这一概念,具体的实现可以看一下这篇博文,多参数时实现的很巧妙。具体应用中可直接用id类型, 一般应用到框架上,还会同时带上协议,例如:


上图为使用Core Location框架(移动设备定位)中,类及协议组成的委托。

[cpp] view plaincopyprint?
  1. <pre></pre>  
  2. <pre></pre>  
  3. <pre></pre>  
  4. <pre></pre>  

原创粉丝点击