什么是代理(Delegate)
- 是一种软件设计模式
- iOS中以@protocol实现
- 一对一
工作流程
代理工作流程.png首先明确委托方、代理方和协议的概念:
委托方:公司
代理方:员工
协议:合同
委托方会要求代理需要实现那些内容,然后代理方按照协议实现方法
// 协议
@protocol YKOrderFilterViewDelegate <NSObject>
@optional
/**
* 查询订单
* @param sender
* @by Si
*/
- (void)orderFilterViewSearchBtnAction:(UIButton *)sender textFiled:(UITextField *)textFiled;
/**
* 选择地址
* @param textFiled
* @by Si
*/
- (void)orderFilterViewTextFieldShouldReturn:(UITextField *)textFiled;
@end
// 委托方
@interface YKOrderFilterView : UIView
@property (nonatomic,weak) id<YKOrderFilterViewDelegate> delegate;
@end
@implementation YKOrderFilterView
- (void)searchBtnAction:(UIButton *)sender{
if (self.delegate && [self.delegate respondsToSelector:@selector(orderFilterViewSearchBtnAction:textFiled:)]) {
[self.delegate orderFilterViewSearchBtnAction:sender textFiled:self.searchTextField];
}
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
if (self.delegate && [self.delegate respondsToSelector:@selector(orderFilterViewTextFieldShouldReturn:)]) {
[self.delegate orderFilterViewTextFieldShouldReturn:textField];
}
return YES;
}
@end
// 代理方
@implementation YKOrderManagerViewController
#pragma mark -- YKOrderFilterViewDelegate
- (void)orderFilterViewTextFieldShouldReturn:(UITextField *)textFiled {
self.searchTextField = textFiled;
[self.tableView.mj_header beginRefreshing];
[self.view endEditing:YES];
}
- (void)orderFilterViewSearchBtnAction:(UIButton *)sender textFiled:(UITextField *)textFiled {
self.searchTextField = textFiled;
[self searchBtnAction:sender];
}
@end
一般申明为weak来规避循环引用
image.png一般在代理方都会强引用委托方,而代理再用strong时,会使代理方和委托方相互引用,最后导致谁都不能释放。而weak、assign为弱引用。使用weak时,当对象释放时,weak会自动将指针指向nil,在iOS中向nil发送消息是不会崩溃的。而assign不会,会出现野指针现象。
网友评论