Objective-C:代理(Delegate)

2020-03-23  本文已影响0人  打碟的DJ

什么是代理(Delegate)

工作流程

代理工作流程.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不会,会出现野指针现象。

上一篇 下一篇

猜你喜欢

热点阅读