携手创造,一起成长!这是我参加「日新方案 8 月更文应战」的第21天,点击查看活动详情
署理的知道
署理是一种设计模式,署理类署理托付类完成某些功用。
署理的实质是:托付类在调用办法时托付一个ID指针弱引证的一个署理目标去发送音讯
组成:
协议: 规则音讯的内容
托付类: 托付者是想要完成功用的类,只需调用署理类的署理办法传入参数即可
署理类: 完成托付方的需求,真实完成功用的类
阐明:
- 托付方恳求署理方完成某些功用
- 署理方履行完功用后返回处理结果给托付方
- 这样外部看起来是托付方完成的功用,其实是署理方真实完成的。
- 托付的功用经过协议来规则。
详细运用
下面经过署理完成猫署理狗完成eatFood办法
协议: WYEatFood协议有一个功用便是eatFood.
@protocol WYEatFood <NSObject>
- (void)eatFood;
@end
托付类:
在托付类中做了三件事:
- 设置署理特点,用以获取署理目标
- 在详细的办法完成中先判别署理目标是否有该办法的完成
- 如果有,则经过署理目标进行办法调用
下面代码中将WYDog的eatFood办法托付给delegate去履行。
@interface WYDog : NSObject<WYEatFood>
//设置署理目标,delegate便是恪守了WYEatFood协议的一个目标
@property (nonatomic, weak) id<WYEatFood> delegate;
@end
/*
WYDog作为托付类,它的eatFood办法托付给WYcat来履行。
*/
@implementation WYDog
//让署理目标delegate来履行eatFood办法
- (void)eatFood{
//在履行前先判别是否存在该办法
if ([self.delegate respondsToSelector:@selector(eatFood)]) {
[self.delegate eatFood];
}
}
@end
署理类:
@interface WYCat : NSObject<WYEatFood>
@end
@implementation WYCat
- (void)eatFood{
NSLog(@"猫吃鱼");
}
@end
阐明:
- 署理类中对eatFood办法进行详细的完成
- 署理类中也需要恪守WYEatFood协议。
调用
- (void)viewDidLoad {
[super viewDidLoad];
WYDog *dog = [WYDog alloc];
WYCat *cat = [WYCat alloc];
dog.delegate = cat;
[dog eatFood];
}
运行结果:
2021-11-12 21:26:48.258351+0800 署理学习[19924:153821] 猫吃鱼
阐明:
- dog履行eatFood办法,其结果为”猫吃鱼”,阐明其实是cat履行的。
- 我们经过将cat赋值给dog的delegate就做到了WYCat类署理WYDog类
留意:
- 要运用weak来修饰署理特点,由于如果托付类的署理特点强引证了署理目标,而署理目标内部又强引证了托付类的目标,就会造成循环引证
- 不能运用assign,由于它在被目标释放掉之后,不会主动的将指针指向nil,就成野指针了,而weak会主动的将指针指向nil
总结:
- 署理的实质是托付类在调用办法时经过一个ID指针弱引证的一个署理目标去发送音讯
- 我们在托付类设置署理目标后,实际上仅仅用一个恪守某一个协议的id类型指针将署理目标进行了一个弱引证,这样任何恪守了该协议的目标都可以作为署理
- 托付方让署理履行操作,实际上便是让署理目标直接调用该办法。