• ios--->OC中Protocol理解及在代理模式中的使用


    OC中Protocol理解及在代理模式中的使用

    Protocol基本概念
    • Protocol翻译过来, 叫做”协议”,其作用就是用来声明一些方法;
    Protocol(协议)的作用
    • 定义一套公用的接口(Public)

      • @required:必须实现的方法,默认在@protocol里的方法都要求实现。
      • @optional:可选实现的方法(可以全部都不实现)
    • 委托代理(Delegate)传值

      • 它本身是一个设计模式,它的意思是委托别人去做某事。
      • 比如:两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。又比如:控制器(Controller)与控制器(Controller)之间的传值,从C1跳转到C2,再从C2返回到C1时需要通知C1更新UI或者是做其它的事情,这时候我们就用到了代理(Delegate)传值;
    protocol和继承区别
    • 继承之后默认就有实现, 而protocol只有声明没有实现
    • 相同类型的类可以使用继承, 但是不同类型的类只能使用protocol
    • protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可
    运用实例
    //1.定义协议类
    #import <UIKit/UIKit.h>
    @class XMGCartItem,XMGCartCellTableViewCell;
    
    @protocol XMGCartCellTableViewDelegate <NSObject> // 定义协议
    -(void)winecelladdfun:(XMGCartCellTableViewCell *)cell; //协议方法
    -(void)winecellreduesfun:(XMGCartCellTableViewCell *)cell;//协议方法
    
    @end
    
    @interface XMGCartCellTableViewCell : UITableViewCell
    @property(nonatomic,strong)XMGCartItem *winecell;
    @property(nonatomic,weak)id<XMGCartCellTableViewDelegate>delegate;  //协议属性
    @end
    
    //2.协议类中何时调用协议方法
    #import "XMGCartCellTableViewCell.h"
    #import "XMGCartItem.h"
    @interface XMGCartCellTableViewCell ()
    
    @end
    
    @implementation XMGCartCellTableViewCell
    
    - (void)awakeFromNib {
        [super awakeFromNib];
    
    }
    
    - (IBAction)reducebtn:(UIButton *)sender {
    //开始调用协议方法
        if([self.delegate respondsToSelector:@selector(respondsToSelector:)]){
            [self.delegate winecellreduesfun:self];
        }
    }
    @end
    
    
    //3.某类遵守协议并实现协议
    @interface XMGCartViewController () <XMGCartCellTableViewDelegate>
    @end
        //协议实现
    #pragma XMGCartCellTableViewDelegate
    -(void)winecelladdfun:(XMGCartCellTableViewCell *)cell
    {
        int totalmoney=self.totalmoney.text.intValue + cell.winecell.money.intValue;
        self.totalmoney.text=[NSString stringWithFormat:@"%d",totalmoney];
    }
    
    
    
  • 相关阅读:
    centos系统/dev/mapper/centosroot目录被占满的解决方式
    SpringBoot上如何实现文件上传 FILE
    java list 和数组直接相互转换
    vue axios.defaults.withCredentials = true
    java中局部变量需要初始化吗
    用Java实现MD5加盐
    java map 合并两个map map集合的putall_Java Map.putAll()方法:追加另一个Map对象到当前Map集合
    JSON字符串转HashMap Gson
    OO_Lab2总结博客
    采购签核 RFC bapi_po_release 淡淡
  • 原文地址:https://www.cnblogs.com/frankltf/p/7911133.html
Copyright © 2020-2023  润新知