为了账号安全,请及时绑定邮箱和手机立即绑定

iOS Block和代理的区别与使用

标签:
iOS

               

理论知识点

  • NotificationCenter 通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;

  • delegate 代理委托:“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败

  • block(闭包) block和delegate一样,一般都是“一对一”之间通信交互,相比代理block有以下特点
    1.写法更简练,不需要写protocol、函数等等
    2.block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
    3.block需要注意防止循环引用

1、在.h中声明代理和block

#import <Foundation/Foundation.h>//  声明一个delegate和blocktypedef void(^clickBackBlock)(void);@protocol Block_DelegateClass <NSObject>- (void)clickBackDelegate;@end@interface Block_DelegateClass : NSObject@property (nonatomic, weak) id<Block_DelegateClass> delegatel;@property (nonatomic, copy) clickBackBlock block;

- (void)doSomething;@end

2、doSomething中让他的代理去实现

#import "Block_DelegateClass.h"@implementation Block_DelegateClass- (void)doSomething {    
    /**
     * block和代理的调用区别
     */
    if (self.block) {   //  判断block是否指向了某个block实体 ^(传入参数列){行为主体};
        self.block();  //  执行指向的block实体的代码块 ^{}
    }    
    if (self.delegatel) {  //  判断delegate是否有对象赋值
        [self.delegatel clickBackDelegate];  // 调用代理方法
    }
}@end

3、外部的某个类成为A类的代理

#import "OneViewController.h"#import "Block_DelegateClass.h"@interface OneViewController ()<Block_DelegateClass>@property(nonatomic, strong) Block_DelegateClass *blockAnddeleagate;@end@implementation OneViewController- (void)viewDidLoad {
    [super viewDidLoad];
    _blockAnddeleagate = [[Block_DelegateClass alloc] init];
    
    _blockAnddeleagate.block = ^{   // 让block指向一个实体代码块,等待被调用时候执行
        NSLog(@"我是block体,我替别人doSomething");
    };
    
    _blockAnddeleagate.delegatel = self;  //  self 成为代理对象
    
    
    [self callMethod];    // Do any additional setup after loading the view.}#pragma mark - Block_DelegateClass// 实现代理方法- (void)clickBackDelegate {    NSLog(@"我是代理,我替别人doSomething");
}#pragma mark - event Method- (void)callMethod {
    [_blockAnddeleagate doSomething];
}@end

原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消