一、何为代理模式?
关键点如下:
- 协议 :定义代理和委托的共同接口(方法)
- 委托方 :根据指定的协议,委托代理去完成实现指定接口(方法)
- 代理者 :根据指定的协议,实现委托需要实现的接口(方法)
口水话解释: 苹果-委托方,苏宁-代理方,代理权合同-协议,苹果按照协议向苏宁收取分成,苏宁得遵守这个协议苹果才给他代理权给他手机卖,苏宁遵守协议得到代理权卖手机,得到协议规定的分成部分。
二、使用
- 首先是委托者的.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];
}
三、代理模式总结
- 具有良好的扩展性。委托的业务逻辑可能会随时改变,当有新增功能,只需要在协议中增加方法就能不影响原有功能的情况下增加新功能
- 有利与代码的封装。如果一个类,实现了某个协议,那么这个协议中的属性或方法就不必公有化,就可以被定义协议的类调用。这样可以减少一个类暴露给外部的方法
网友评论