C的委托机制【附代码】

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

 

C的委托机制【附代码】

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/3addec1dd6461b596bafcc9e78664ad3.html