Objective-C中的委托

Objective-C中的委托,第1张

概述委托在IOS开发框架Cocoa Touch 中经常使用,其含义是一个类的对象要求委托对象执行它的某些 *** 作。委托机制实际是种设计模式,通过此种机制,能降低对象间的耦合。还是不继续说概念了,直接上定义代码(点这里下载) //环境 //Mac OS X 10.3.7 //Xcode Version 4.2.1 //使用的是Xcode的Command Line Tool工程,结果由命令行输出 [cpp]

委托在IOS开发框架Cocoa touch 中经常使用,其含义是一个类的对象要求委托对象执行它的某些 *** 作。委托机制实际是种设计模式,通过此种机制,能降低对象间的耦合。还是不继续说概念了,直接上定义代码(点这里下载)

//环境

//Mac OS X 10.3.7

//Xcode Version 4.2.1

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

[cpp] view plain copy print ? @interface MyFrameWork : NSObject{   }   @property (nonatomic,assign)NSObject * delegate;//委托对象的指针,类型为NSObject,即一切objective-c类的父类    - (ID)init;   - (voID) callDelegate;   @end   [cpp] view plain copy print ? #import "MyFrameWork.h"       @implementation MyFrameWork   @synthesize delegate;      - (Nsstring *) description{       return (@"I am MyFrameWork");   }   -(ID) init{       self = [super init];       if (self){           }       return  self;       }   <pre name="code" class="cpp">-(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);      }  
          [cpp]     view plain    copy    print    ?       @interface Delegate : NSObject     @property NSInteger number;     -(ID)init;     @end              [cpp]     view plain    copy    print    ?       #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委托实现很简单(大家不许偷笑),但很少会像上面的列子使用,一般应用到框架上,还会同时带上协议,例如: 

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

上篇中,简单介绍了委托如何实现,Core Location框架中,委托与协议共同使用,实现了对象间解耦及灵活性的问题,现在在上一份代码的基础上,新增加一个协议,即ManagerDelegate,此协议只有一个方法decIDeFrameDescription,这就构成了一个委托机制(delegation)(设计模式的一种)。

代码(点击这里下载)

//环境

//Xcode Version 4.3.2 (4E2002)  为了IOS 5.1 升级了新版本的xcode

[cpp] view plain copy print ? #import <Foundation/Foundation.h>    @protocol ManagerDelegate <NSObject> //协议    - (BOol) decIDeFrameDescription;   @end  

通过Delegate实现此协议,即

[cpp] view plain copy print ? @interface Delegate : NSObject<ManagerDelegate>//绑定mangerDelegate    @property NSInteger number;   -(ID)init;   @end  

[cpp] view plain copy print ? #pragma mark-    #pragma mark ManagerDelgate    //实现协议    -(BOol) decIDeFrameDescription{       return NO;       //通过return YES 或者 NO,来控制框架的描述    }   @end  

最终框架会在根据用户在Delegate中协议的描述,完成框架里相应方法的变化,在本例中是

[cpp] view plain copy print ? @implementation MyFrameWork   @synthesize delegate,decIDe;   - (Nsstring *) description{       if([self.decIDe decIDeFrameDescription]){           return (@"I am a MyFrameWork");       }       else{           return (@"I am a decIDed MyFrameWork");       }   }  

在框架中需声明协议接受的对象类型,如下

[cpp] view plain copy print ? @protocol ManagerDelegate; //对协议声明的引用    @interface MyFrameWork : NSObject{   }   @property (nonatomic,assign)NSObject   *delegate;//委托对象的指针,类型为NSObject,即一切objective-c类的父类    @property (nonatomic,assign)ID<ManagerDelegate> decIDe;//声明需要接受实现了ManagerDelegate协议的对象    - (ID)init;   - (voID) callDelegate;   @end  

最终,我们通过在Delegate中实现ManagerDelegate协议,而框架通过decIDeFrameDescription的返回值,实现了改变。像在Cocoa touch框架中,如果我们要使用一个picker(选取器),但框架不知道我们要的是几个组件的picker和每个组件的内容,所以需要在我们的VIEwControler中实现<UIPickerVIEwDelegate>和<UIPickerVIEwDataSource>.如果在numberOfComponentsInPickerVIEw中返回2,完成numberOfRowsInComponent的组件选择,完成UIPickerVIEwDataSource协议。
运行显示效果如下图:


    <此例为其他工程截图>

总结

以上是内存溢出为你收集整理的Objective-C中的委托全部内容,希望文章能够帮你解决Objective-C中的委托所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1058439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存