iOS中delegate(委托)的使用

委托
       委托,就是委托他人帮自己去做什么事。也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法。
     举例:这个周末放假有空,我想买个手机,所以我有个buyIphone 方法,但是我不知道谁能买手机,所以把这个需求发布出去(比如公布在网站上),如果有卖手机的商人(也就是说他能实现buyIphone这个方法)看到,他就会接受我的委托,(在商人自己的类中实现<XXXdelegate>),那么我的委托对象就指向了这个商人..当我要买手机的时候,直接找他就行了.
例如:在Me.h中
@protocol BuyDelegate------买手机协议
  -(void)buyIphone:(NSString *)iphoneType money:(NSString *)money;
@end
@interface Me : NSObject----我
{
  id<BuyDelegate> deleage;----我要找一个具备BuyDelegate行为能力的人,帮我买手机的人
}
  @property(assign,nonatomic)id<BuyDelegate>delegate;
@end

代码中声明了一个协议 名叫BuyDelegate,在其中有一个buyIphone方法,即一个委托项。当我要购买手机的时候只需要通过delegate 调用 BuyIphone方法即可.如下:在Me.m中

-(void)willbuy--------我要叫委托人帮我买手机
{
  [delegate buyIphone:@"iphone 4s" money:@"4888"];
}
例如:商人类实现了这一委托(用<BuyDelegate>表示实现),在Business.h中
#import <Foundation/Foundation.h>
#import"My.h"
@interface Business : NSObject<BuyDelegate>
@end

然后在Business.m中调用 buyIphone方法

#import"Business.h"
@implementation Business
-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money
{
  NSLog(@"手机有货,这个价钱卖你了,发货中!!");
}
@end

接下来,应该如何把我和委托人联系起来呢?

@interface MyWeekend(周末放假) : UIResponder <UIApplicationDelegate>
{  
    Me *ken;  // 我
    Business *js; // 代理商
}  
@end  

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions---来到电脑城门口了
{
    ken = [[Me alloc]init];      // 确定男主角
    js = [[Business alloc]init]; // 确定商家
    ken.delegate = js;           // 男主角找到商家
    [ken willbuy];               // 开始买
}

最后,我想分享一下在使用委托的时候的一些心得和注意事项。
心得:delegate的命名要准确,尽量看名字就知道用法。delegate和通知有的用法有些象,但是前者是单对单的,后者是单对多的情况。
注意:在dealloc要把delegate至为nil,还有就是delegate设置属性的时候要用assign,不要用retain。

通常,一个delegate的使用过程,需要经过五步:
1.     创建一个 delegate;
2.    委托者声明一个delegate;
3.    委托者调用delegate内的方法(method);
4.    被委托者设置delegate,以便被委托者调用;
5.    被委托者实现Delegate 所定义的方法。

写了一个简单的委托的试用测试:
首先创建FunctionTest类,声明委托:

FunctionTest.h
@protocol FunctionTestDelegate <NSObject>  
    - (void)func3;  
    - (void)func4;    
@end  
  
@interface FunctionTest : NSObject  
{  
    id<FunctionTestDelegate> delegate;  
}  
@property (nonatomic, assign)id<FunctionTestDelegate> delegate;  
- (void)func1;  
- (void)func2;  
@end  
  
在FunctionTest.m中:
@implementation FunctionTest  
@synthesize delegate;  
- (void)func1  
{  
    NSLog(@"function 1 called");  
    [delegate performSelector:@selector(func3)];  
}  
  
- (void)func2  
{  
    NSLog(@"function 2 called");  
    [delegate performSelector:@selector(func4)];  
}  
@end
在入口类Appdelegate中实现委托:

在AppDelegate.h中:

#import <UIKit/UIKit.h>  
#import "FunctionTest.h"  
@class ViewController;  
@interface AppDelegate : UIResponder <UIApplicationDelegate,FunctionTestDelegate>  
{  
    FunctionTest *test;  
}  
  
@property (strong, nonatomic) UIWindow *window;  
@property (strong, nonatomic) ViewController *viewController;  
@end  
在AppDelegate.m中:
- (void)func3  
{  
    NSLog(@"function 3 calledns");  
}  
- (void)func4  
{  
    NSLog(@"function 4 calledns");  
}  

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    test = [[FunctionTest alloc]init];  
    test.delegate = self;  
    [test func1];
    [test func2];  
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值