当前位置: 首页 > news >正文

block和代理使用对比

demo设计:做简单的抽奖,在viewcontroller中调用代理和block去获得抽奖号码,在viecontroller中打印出来。

代理类的.h文件

@protocol DelegateClassDelegate;

@interface DelegateClass : NSObject

@property(nonatomic,weak) id<DelegateClassDelegate> delegate;

-(void)dosomthing;

@end

@protocol DelegateClassDelegate <NSObject>

-(void)DelegateClass:(DelegateClass *)delegateClass passNum:(NSUInteger)num;

@end

代理类的.m 文件

@implementation DelegateClass

-(void)dosomthing{
    
    NSUInteger random = arc4random()%100;
    [self.delegate DelegateClass:self passNum:random];
    
}
@end

block 类的.h文件

@interface BlockClass : NSObject

-(void)dosomething:(void (^)(NSUInteger num))passnumblock;

@end

block类的.m文件

@implementation BlockClass

-(void)dosomething:(void (^)(NSUInteger num))passnumblock{
    
     NSUInteger random = arc4random()%100;
    passnumblock(random);
}

@end

在viewcontroller中调用

#import "ViewController.h"
#import "DelegateClass.h"
#import "BlockClass.h"

@interface ViewController ()<DelegateClassDelegate>
@property(nonatomic,strong) DelegateClass *delegateClass;
@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    self.delegateClass = [[DelegateClass alloc] init];
    self.delegateClass.delegate = self;
    
    //触发方法
    [self.delegateClass dosomthing];
    BlockClass *block = [[BlockClass alloc] init];
    [block dosomething:^(NSUInteger num) {
        NSLog(@"通过block获得的抽奖号码是%ld",num);
    }];
    [block dosomething:^(NSUInteger num) {
         NSLog(@"通过block获得的抽奖号码是%ld",num);
    }];
}
- (void)DelegateClass:(DelegateClass *)delegateClass passNum:(NSUInteger)num{
    NSLog(@"通过代理获得的抽奖号码是%ld",num);
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

打印结果:

2016-02-27 15:50:08.017 delegateAndBlock[8338:1753403] 通过代理获得的抽奖号码是63

2016-02-27 15:50:08.017 delegateAndBlock[8338:1753403] 通过block获得的抽奖号码是85

2016-02-27 15:50:08.017 delegateAndBlock[8338:1753403] 通过block获得的抽奖号码是46

总结:

代理是一对一的实现,block可以实现一对多

代理的使用较为麻烦,block相对简单,并且代码的逻辑更连贯,可读性强

代理在做自定义控件时很有优势,因为代理消息触发机制比较灵活,代理可以根据用户的对代理类的操作而发送消息,但是block的消息发送只能是通过调用block类的那个对象来触发,代理像一个高级的仆人,他不仅可以帮你实现你想让他干的事,他还会主动处理他收到的从用户那里接受到的消息,但是他不能同时处理多个任务。而block则像部队,部队可以有很多个兵,但是他比较笨,你让他干什么他才干什么,他可以随时处理多个任务。

转载于:https://www.cnblogs.com/mengdaxia117/p/5223083.html

相关文章:

  • 向量运算
  • 上传文件路径为何需要使用双斜杠
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Opencv 学习资料集合(更新中。。。)
  • linux 复制目录结构,但不复制文件
  • Linux 定时器
  • HBase源码分析之HRegion上compact流程分析(一)
  • [iOS]如何删除工程里面用cocoapods导入的第三方库
  • KVC和KVO
  • @synthesize和@dynamic分别有什么作用?
  • Shell 中的空值(null value)和不存在是不一样的。
  • 提高自己应用性能的总结架构篇
  • 什么是端口映射
  • java中使用poi实现导入Excel
  • asp.net预定义的HttpModule
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Android交互
  • C++11: atomic 头文件
  • ES6核心特性
  • httpie使用详解
  • java 多线程基础, 我觉得还是有必要看看的
  • js写一个简单的选项卡
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Sublime text 3 3103 注册码
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 从零开始学习部署
  • 开源地图数据可视化库——mapnik
  • 使用SAX解析XML
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 数据可视化之下发图实践
  • ${ }的特别功能
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (6)设计一个TimeMap
  • (Matlab)使用竞争神经网络实现数据聚类
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二十三)Flask之高频面试点
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET中 MVC 工厂模式浅析
  • /var/spool/postfix/maildrop 下有大量文件
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [100天算法】-目标和(day 79)
  • [AIGC] Java 和 Kotlin 的区别
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [cocos2d-x]关于CC_CALLBACK