一、定义:
代理模式是一种传递消息的模式,整个模式包括:协议、委托、代理三个模块。
协议:定义的规则,规则就是代理方需要实现的方法
委托:委托人,事件的委托方
代理:根据协议做事情的人,实现委托人所托付的事情
二、页面传值写法
目的:A控制器跳转到B控制器,再从B控制跳转回来,并且带回一个值。
(1 )在B控制器声明协议及属性,在跳转回A控制器的方法里写代理方法传值
(2)在A控制器遵守协议,实现协议方法接收传过来的值
协议:声明
@protocol BVDelegate
@required//必须实现
-(void)number:(NSInteger)number;
@optional//不必须实现
-(void)stringNumber:(NSString *)str;
@end
协议:声明一个属性
@interface BViewController : UIViewController
@property (nontomic, weak) id <BVDelegate> bvDelegate;
@end
委托:
-(void)touchesBegan:(NSSet<UITouch*>*)touches withEvent:(UIEvent*)event{
// 判断代理方法是否存在
if([self.bvDelegaterespondsToSelector:@selector(stringNumber:)]){
[self.bvDelegatestringNumber:@"回传"];
}
[selfdismissViewControllerAnimated:YES completion:nil];
}
代理:
签订协议:
@interface AViewController()<bvDelegate>
设置代理:
-(void)touchesBegan:(NSSet<UITouch*>*)touches withEvent:(UIEvent*)event{
BViewController *BVC = [[BViewController alloc]init];
BVC.delegate = self;
}
实现代理方法:
-(void)stringNumber:(NSString *)str{
NSLog(“%@”,str);
}
三、注意点
1.strong:该对象强引用delegate,会导致循环引用。
2.assing:采用assign修饰代理时,是指针赋值,从而导致成为了一个野指针;
3.weak:当对象释放时,weak会自动将指针指向nil