iOS记录iOS技术专题iOS 进阶

iOS代理模式

2018-08-06  本文已影响2388人  dozening007

概述

代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象、代理对象和协议。

名词解释


1.Protocol-协议

从上图中我们可以看到三方之间的关系,在实际应用中通过协议来规定代理双方的行为,协议中的内容一般都是方法列表,当然也可以定义属性,我会在后续文章中顺带讲一下协议中定义属性。

协议是公共的定义,如果只是某个类使用,我们常做的就是写在某个类中。如果是多个类都是用同一个协议,建议创建一个Protocol文件,在这个文件中定义协议。遵循的协议可以被继承,例如我们常用的UITableView,由于继承自UIScrollView的缘故,所以也将UIScrollViewDelegate继承了过来,我们可以通过代理方法获取UITableView偏移量等状态参数。

协议只能定义公用的一套接口,类似于一个约束代理双方的作用。但不能提供具体的实现方法,实现方法需要代理对象去实现。协议可以继承其他协议,并且可以继承多个协议,在iOS中对象是不支持多继承的,而协议可以多继承。

@interface TMGameViewControllerNew ()<ILVLiveAVListener,ILVLiveIMListener,AVAudioPlayerDelegate,TMGameViewModelDelegate,TMGameShowViewProcotol,TMGameControlViewDelegate,QAVChangeDelegate,CAAnimationDelegate,TMMsgTooBarDelegate,UINavigationControllerDelegate>{
    NSInteger _chargeSource;
    BOOL _firstComeRoom;
    BOOL _firstGuideCamera;
}

2.委托对象

if ([self.delegate respondsToSelector:@selector(userLoginWithUsername:password:)]) {
      // 调用代理对象的登录方法,代理对象去实现登录方法
      [self.delegate userLoginWithUsername:self.username.text password:self.password.text];
  }


3.代理对象

    self.gameView = [[TMGameView alloc]initWithFrame:self.view.frame parentVC:self viewModel:self.gameViewModel];
    self.gameView.avIsLoad = NO;
    self.gameView.showView.delegate = self;
    self.gameView.controlView.delegate = self;
    self.gameView.msgToolBar.delegate = self;
/**
 *  代理方实现具体登录细节
 */
- (void)userLoginWithUsername:(NSString *)username password:(NSString *)password {
    NSLog(@"username : %@, password : %@", username, password);
}


4. 代理属性使用weak


5.代理与block对比


相关参考:
https://www.jianshu.com/p/2113ffe54b30

上一篇下一篇

猜你喜欢

热点阅读