iOS Block和代理的区别与使用

作者: 朝雨晚风 | 来源:发表于2018-05-17 10:45 被阅读88次

理论知识点

  • 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和代理的区别与使用

    理论知识点 NotificationCenter 通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,...

  • ios开发之代理,block,通知

    ios开发中控制器与控制器之间的传值与联系,使用最多的是block,代理,通知.那么他们之间有什么区别以及怎么使用...

  • iOS 栈和堆总结

    转载自 :大神博客iOS程序中的内存分配iOS 堆和栈的区别block与propertyiOS中__block 关...

  • iOS琐碎总结

    1.为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别? A:...

  • 2020年iOS进阶面试题总结(二)

    1.为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别? A:...

  • 总结问题

    1、代理和block的区别: 代理优势:代理占用系统资源小,只是存储了一个对象指针,有三个方法以上的话建议使用代理...

  • iOS之——Block

    神一样的存在 iOS开发中copy、retain的定义和区别 Block 为什么使用copy Block在创建的时...

  • block和代理的区别

    block 和 delegate 都可以通知外面。block 更轻型,使用更简单,能够直接访问上下文,这样类中不需...

  • 代理和Block的区别

    相同点:代理和Block大多是我们都可以用来做倒序传值的。我们都得注意避免循环引用。 不同点:代理使用weak修饰...

  • Proxy和的delegate区别

    Proxy和的delegate区别 在ios中使用proxy代理模式,经常容易和delegate委托模式混淆。 委...

网友评论

    本文标题:iOS Block和代理的区别与使用

    本文链接:https://www.haomeiwen.com/subject/rdzvdftx.html