delegate - 代理基础- 03

  • 为什么系统的代理协议的方法 要把代理本身作为参数传进来?
    • 如: 系统的UIScrollViewDelegate代理协议,
      就有很多方法是将代理本身(UIScrollView),做为方法的参数传入。
      如: - (void)scrollViewDidScroll:(UIScrollView *)scrollView;
    • 问 : 系统这样设计,有什么好处呢?
    • 假设, 有2个UIScrollView,设置代理对象为同一个,且遵循了协议。
      @interface ViewController ()
      scrollView.delegate = self; scrollTwo.delegate = self;
      想知道,2个UIScrollView 滚动时到底滚动的是哪一个UIScrollView?
    • UIScrollView的每次滚动,都会调用代理协议的-scrollViewDidScroll:方法.
    • 如果在代理协议UIScrollViewDelegate的方法声明里,不传入代理本身,是根本无法知道,到底是scrollView 还是scrollTwo

  • 协议里的方法声明,一般要用@optional来修饰
    • @optional修饰的方法,可实现也可不实现.
    • 协议的方法声明,默认是@required(必须实现)
      一个协议一般有很多方法声明,在遵守协议的代理方,并不需要实现所有方法.
    • 既然建议选择@optional,那么委托方在调用代理协议的方法A时,要判断代理方是否实现方法A。
      respondsToSelector:
      否则报错 NSInvalidArgumentException

  • 代理的使用范围
    • 一个对象,一般只能设置一个代理。
      假设这个对象只有一个代理属性的情况下。
    • 一个对象,能够成为多个对象的代理。
      VC是自UITableViewDataSource,也是UIScrollViewDelegate的代理
      @interface ViewController ()
         
       -- 设置代理对象
      self.tableView.dataSource = self;
      self.tableView.delegate = self;
      

  • 命名规范:
    代理协议, 类名+Delegate;
    代理方法, 以类名开头

  • 通知和代理的选择
    • 代理: 1个对象只能告诉,另外1个对象发生了什么事。
    • 通知: 1个对象能告诉N个对象发生了什么事。
          1个对象能知道N个对象发生了什么事。
    • 通知比较简单,但是容易出错。
      如, "通知名"拼写错误,在编译时不会有任何提示,运行时才会报错。
    • 代理比较规范,但有些麻烦。
    • 代理和通知都能完成,对象和对象之间的通信!
      但是能用"代理"就不用"通知"

也可以看看

  • protocol - 协议01基础
  • delegate - 代理基础01
  • delegate - 代理基础02
  • delegate - 代理基础03
  • 没有协议的代理-简单实现
  • 代理设计模型-自定义
  • delegate - ScrollView01

来自于哪里?

  • iOS-MJ-UI基础-大神班/临散知识点/delegate-代理基础-03

你可能感兴趣的:(delegate - 代理基础- 03)