delegate 代理是一种设计模式,即一个对象不能完成的事情,委托另一个对象帮其完成。

比如说:A 要订购 电影票,但是 A 自己没办法去订购,于是 A 委托 B 帮其订购电影票,则 B 成为 A 的代理(也称为 A 的委托),同时帮 A 完成订购电影票的事情。

具体实现方法:

1、定义协议

1-1、协议名称

1-2、必须实现的代理方法

1-3、非必须实现的代理方法

如:

@protocol SFDelegate <NSObject>@required
- (void)orderTicker;@optional
- (void)getTicker;@end

2、定义代理

如:

@property (nonatomic, weak) id<SFDelegate> tickerDelegate;

说明:定义代理为属性时,使用weak修饰,避免造成对象的循环引用,引起内存泄露。

3、定义代理方法实现方式

如:

- (void)orderTickerForMe
{NSLog(@"叫人帮我订票");if (self.tickerDelegate && [self.tickerDelegate respondsToSelector:@selector(orderTicker)]){[self.tickerDelegate orderTicker];}
}
- (void)getTickerForMe
{NSLog(@"叫人帮我取票");if (self.tickerDelegate && [self.tickerDelegate respondsToSelector:@selector(getTicker)]){[self.tickerDelegate getTicker];}
}

使用注意事项:

1、导入该对象的头文件

2、实例化该对象

3、设置该对象的代理

4、添加该对象的协议

5、实现该对象的代理方法

说明:

1、delegate 代理方法是一对一的关系,即一个 A 对象,同一时间内只能委托一个 B 对象帮其完成需要完成的事件。

2、使用场景:

2-1、由其他对象协助完成其他事情

2-2、用于传值

定义协议的视图控制器

// .h文件
#import <UIKit/UIKit.h>@protocol SFDelegate <NSObject>@required
- (void)orderTicker;@optional
- (void)getTicker;@end@interface SFViewController : UIViewController@property (nonatomic, assign) id<SFDelegate> tickerDelegate;- (void)orderTickerForMe;- (void)getTickerForMe;@end
// .m文件
#import "SFViewController.h"@interface SFViewController ()@end@implementation SFViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}- (void)orderTickerForMe
{NSLog(@"叫人帮我订票");if (self.tickerDelegate && [self.tickerDelegate respondsToSelector:@selector(orderTicker)]){[self.tickerDelegate orderTicker];}
}- (void)getTickerForMe
{NSLog(@"叫人帮我取票");if (self.tickerDelegate && [self.tickerDelegate respondsToSelector:@selector(getTicker)]){[self.tickerDelegate getTicker];}
}@end

实现代理方法的视图控制器

#import "SYViewController.h"
#import "SFViewController.h"@interface SYViewController () <SFDelegate>
//{
//    SFViewController *sfVC;
//}@property (nonatomic, strong) SFViewController *sfVC;@end@implementation SYViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.title = @"sf delegate";UIBarButtonItem *order = [[UIBarButtonItem alloc] initWithTitle:@"order" style:UIBarButtonItemStyleDone target:self action:@selector(tickerOrder)];UIBarButtonItem *get = [[UIBarButtonItem alloc] initWithTitle:@"get" style:UIBarButtonItemStyleDone target:self action:@selector(tickerGet)];self.navigationItem.rightBarButtonItems = @[order, get];self.sfVC = [[SFViewController alloc] init];self.sfVC.tickerDelegate = self;
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}- (void)tickerOrder
{[self.sfVC orderTickerForMe];
}- (void)tickerGet
{[self.sfVC getTickerForMe];
}- (void)orderTicker
{NSLog(@"我帮你订了票");
}- (void)getTicker
{NSLog(@"我帮你取了票");
}@end

delegate的使用相关推荐

  1. 理解委托(delegate)及为什么要使用委托

    委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他们各 ...

  2. swift中delegate与block的反向传值

    swift.jpg 入门级 此处只简单举例并不深究,深究我也深究不来.对于初学者来说delegate或block都不是一下子能理解的,所以我的建议和体会就是,理不理解咱先不说,我先把这个格式记住,对就 ...

  3. 在请求完成后回调delegate的方法。然而回调时经常遇到这种情况:delegate已经被释放...

    最近的项目遇到了网络请求,需要在请求完成后回调delegate的方法.然而回调时经常遇到这种情况:delegate已经被释放,这时调用其方法则会引起crash. objc的runtime中有两种判断类 ...

  4. 异步使用委托delegate --- BeginInvoke和EndInvoke方法

    当我们定义一个委托的时候,一般语言运行时会自动帮委托定义BeginInvoke 和 EndInvoke两个方法,这两个方法的作用是可以异步调用委托. 方法BeginInvoke有两个参数: Async ...

  5. 对delegate进行扩展 打造通用的计时完成方法

    连接数据库是程序员经常要做的事情, 通常情况下, 需要连接SQL Server中哪个数据库是已知的, 用户在输入SQL Server的服务器IP.用户名.密码和数据库名字后, 如果所有信息输入正确, ...

  6. Swift - 委托(delegate)的介绍,及使用样例

    1,委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象B的引用存为一个实例变量 ...

  7. C#中Action与delegate、EventHandler的差异

    Action是一个泛型的委托,其内部即使用delegate去实现,当普通的delegate定义的参数与Action个数.类型一致时,两者实现的功能是一样的.只是Action的方式更加简洁.规范.如下: ...

  8. 【转】iOS开发-Protocol协议及委托代理(Delegate)传值

    原文网址:http://www.cnblogs.com/GarveyCalvin/p/4210828.html 前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来 ...

  9. c# 带返回值的action_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别...

    今天来讲一讲<C#delegate.event.Action.EventHandler的使用和区别> 目录 所以,event应运而生 所以,EventHandler应运而生 所以,Acti ...

  10. iOS视图控制器之间delegate传值

    2019独角兽企业重金招聘Python工程师标准>>> // ** *为了从ViewControllerB往回传值到ViewControllerA,我们需要使用协议(Protocol ...

最新文章

  1. Android ndk 安装教程 以及环境变量配置
  2. RTX 30系游戏本来了!1月26日开售,售价999美元起
  3. 瑞幸咖啡官网的视频播放原理讲解
  4. 找出两个字符串数组中的相同元素
  5. 我的世界服务器自定义怪物怎么用,我的世界怪物属性自定义教程 怪物属性代码一览...
  6. mysql的面试2_mysql数据库面试题(2)
  7. 在SQL Server中加入包含假设和CE模型变化
  8. VMware player桥接模式不能联网的解决方法
  9. python简单的聚类分析代码_python kmeans聚类简单介绍和实现代码
  10. Open3d之八叉树(Octree)
  11. 微型计算机与巨型计算机相比,微型计算机的特点及应用
  12. 51单片机 | 红外遥控实验
  13. 如何免费下载qq音乐 ----ctf学习之php漏洞
  14. Mysql使用Key/Value方式存储动态扩展字段、对象与HashMap的相互转化
  15. boot的时候无法进入BIOS,无法使用键盘
  16. 一个毕业6年的程序员工作经历和成长感悟(终)
  17. 漫谈数据安全-老板担心敏感数据泄露,该如何建设数据的安全体系?
  18. 正则匹配ip地址,手机号,对象类型
  19. 【pandas】dataframe中重复数据比较、筛选、去除等
  20. Flutter对接第三方高德地图+百度地图基础定位实现

热门文章

  1. 安卓 linux launcher,关于android使用自己的launcher替换默认launcher的方法
  2. 如何上传项目到github
  3. linux CPU使用率过高或负载过高的处理思路
  4. 【汇正财经】红筹股和H股有什么区别?
  5. C/C++编程:Google代码规范
  6. 收银怎样挂单和取单_收银机如何取消挂单
  7. 今天一不小心,把抖爸爸给爬了
  8. CustomList
  9. 基于阿里云服务器ECS和宝塔面板,适合初学者的蚂蚁笔记(Leanote)超详细配置教程(但是真的不好用)
  10. 如何查询个人电脑的最大支持内存?