神刀安全网

iOS Block和代理的区别与使用

理论知识点

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

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

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

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

#import <Foundation/Foundation.h> //  声明一个delegate和block typedef 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 

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » iOS Block和代理的区别与使用

分享到:更多 ()