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