iOS关于代理的用法

代理的结构与关系

代理由协议、委托方和代理方三部分组成。协议是一个方法列表,只提供方法名称,不提供具体实现。举个例子就是合同中的甲方乙方,合同就是协议,甲方相当于委托方(出钱),乙方相当于代理方(出力)。具体关系如图:
iOS关于代理的用法_第1张图片

协议中的方法分两种,@optional和@required,创建一个协议如果没有声明,默认是@required状态的。这两个修饰符只是约定代理是否强制需要遵守协议,如果@required状态的方法代理没有遵守,会报一个黄色的警告,只是起一个约束的作用,没有其他功能。无论是哪种,都要在委托方中实现respondsToSelector方法,检查代理是否实现了代理方法。否则会导致崩溃。

代理的使用

代理我们用的最多的就是反向传值,代理原来是协议、委托方、代理方、是分开创建的。现在为了方便很多都是将协议放在了委托方里面创建。但是如果多个控制器都会用到相同的代理方法,便可以将协议单独创建。

分开创建

//委托方.h部分
@protocol shoppingCartCellDelegate 
- (void)selectAtIndex:(NSInteger)row;
@property (nonatomic, weak)id delegate;
//委托方.m部分
- (IBAction)selectCell:(UIButton *)sender {
    if ([self.delegate respondsToSelector:@selector(selectAtIndex:)]) {
        self.isSelectCell.selected = YES;
        [self.delegate selectAtIndex:sender.tag];
    }
}
//.m代理方实现相应功能
- (void)selectAtIndex:(NSInteger)row{
    CartModelProductResponseList *model =  self.MTArray[row];
    if (model.isBtnSelect == YES){
        model.isBtnSelect = NO;
        [self.priceWithDeleteView.allSelect setImage:[UIImage imageNamed:@"noSelectC"] forState:(UIControlStateNormal)];
        [self.headerView.allSelect setImage:[UIImage imageNamed:@"noSelectC"] forState:(UIControlStateNormal)];
    } else if (model.isBtnSelect == NO){
        model.isBtnSelect = YES;
        for (int i = 0; i < self.MTArray.count; i++ ) {
        }
    }
   // 替换
    [self.MTArray replaceObjectAtIndex:row withObject:model];
     self.priceWithDeleteView.allPrice.text = [self ZongHeJiSuan:self.MTArray];
    [self.tableView reloadData];
}

<以上代码为我工程中的代码片段,不需要深入理解,只是举个例子。

关于weak,assign,strong问题

因为strong为强引用,使用strong会使代理方和委托方相互引用,最后导致谁都不能释放。
而weak、assign为弱引用。使用weak时,当对象释放时,weak会自动将指针指向nil,在iOS中向nil发送消息是不会崩溃的。而assign不会,会出现野指针现象。

你可能感兴趣的:(iOS关于代理的用法)