美文网首页
iOS 代理模式

iOS 代理模式

作者: HH思無邪 | 来源:发表于2019-02-12 17:52 被阅读19次
代理模式.png

一、何为代理模式?

关键点如下:

  • 协议 :定义代理和委托的共同接口(方法)
  • 委托方 :根据指定的协议,委托代理去完成实现指定接口(方法)
  • 代理者 :根据指定的协议,实现委托需要实现的接口(方法)

口水话解释: 苹果-委托方,苏宁-代理方,代理权合同-协议,苹果按照协议向苏宁收取分成,苏宁得遵守这个协议苹果才给他代理权给他手机卖,苏宁遵守协议得到代理权卖手机,得到协议规定的分成部分。

二、使用

  • 首先是委托者的.h文件中的代理指定以及声明
@protocol YHUMshareviewDelegate <NSObject>
@optional //默认修饰符
- (void)didSelectItemAtIndex:(NSInteger)index;
@end

@interface YHUMshareAlertView : UIView
@property (nonatomic, weak) id <YHUMshareviewDelegate> delegate;//声明代理
@end

协议的修饰符 @optional和@required
创建一个协议如果没有声明,默认是@required状态的。这两个修饰符只是约定代理是否强制需要遵守协议,
如果@required状态的方法代理没有遵守,会报一个黄色的警告,只是起一个约束的作用,没有其他功能

代理属性使用weak 为什么呢?
避免循环引用;
为什么会循环引用?
EG:tableViewController中,控制器的view就是tableView,这就相当于tableViewController强引用着tableView(代理对象);
然后
当我们设置delegate的时候,一般都是让tableViewController成为代理,这个时候代理如果也使用strong,那么tableView的delegate又强引用着tableViewController,所以导致循环引用,因此代理得用weak!

  • 接下来看看委托者的.m文件 如何调用代理方法
/**
     * self.delegate 判断一下控制器有没有遵守协议设置代理
     * [self.delegate respondsToSelector:@selector(didSelectItemAtIndex:)]判断有没有实现这个代理方法
     */
 if (self.delegate && [self.delegate respondsToSelector:@selector(didSelectItemAtIndex:)]) {
       [self.delegate didSelectItemAtIndex:indexPath.row];
    }
  • 代理者遵守协议实现协议中的方法
 // 首先是要遵守这个协议
@interface YHHomepageVC ()<YHUMshareviewDelegate>
// 然后要设置代理者为当前对象(self)

        self.shareView.delegate = self;
//实现协议中规定的方法
#pragma -mark ———————————YHUMshareviewDelegate——————————————————
- (void)didSelectItemAtIndex:(NSInteger)index
{
    [_shareView  disAlterview];
}

三、代理模式总结

  • 具有良好的扩展性。委托的业务逻辑可能会随时改变,当有新增功能,只需要在协议中增加方法就能不影响原有功能的情况下增加新功能
  • 有利与代码的封装。如果一个类,实现了某个协议,那么这个协议中的属性或方法就不必公有化,就可以被定义协议的类调用。这样可以减少一个类暴露给外部的方法

相关文章

网友评论

      本文标题:iOS 代理模式

      本文链接:https://www.haomeiwen.com/subject/loykeqtx.html