携手创造,一起成长!这是我参加「日新方案 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类型指针将署理目标进行了一个弱引证,这样任何恪守了该协议的目标都可以作为署理
  • 托付方让署理履行操作,实际上便是让署理目标直接调用该办法。