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相对简单,并且代码的逻辑更连贯,可读性强

代理在做自定义控件时很有优势

时间: 2025-01-14 15:48:51

block和代理使用对比的相关文章

iOS开发——项目实用技术OC篇&amp;将Block作为代理来使用,实现传值

将Block作为代理来使用,实现传值 在这里http://www.cnblogs.com/iCocos/p/4659878.html,笔者已经将代理,Block,通知传值的方式总结了一下,今天使用的不一样,我们这里使用的是在一个方法中将一个block代码保存起来,再回到blcok内部去执行. 这里使用的是在地图中,,,,好了不多说,开干 1:首先,定义一个blcok typedef void(^ResultBlock)(CLLocation *currentLoc, CLPlacemark *p

iOS开发——OC篇&amp;消息传递机制(KVO/NOtification/Block/代理/Target-Action)

iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action) 今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Foundation Framework的,不过本文中还介绍了一些超出Foundation Framework(KVO和Notification)范围的一些消息传递机制,另外还介绍了delegation,block和target- action. 大多数情况下,消息传递该使用什么机制,是很明确的了,当然了,在某

block和代理小结

代理使用原则: 代理方法的参数是要传的值,代理方法的返回值是要得到的值(即要调用的类回传的值),并且在实现的代理方法中的值就是原来的类要传的值(设置delegate=self), 比如2个类 A,B A类中有个代理方法(int)Adelegate(int a) B类实现代理方法(int)Adelegate(int a){ return b:} 那么 a是传给B类的值,而b是传给A类的值. 例子: 首先关于代理 @protocol NextViewControllerDelegate<NSObje

block与代理的异同点

block,以及代理什么时候要用到啊? 封装变化点,解决类耦合  block与代理之间的区别 1.block是在代理之后出现的技术,比代理更加灵活,但是可读性不好 2.代理在4.x之前一直都在使用,清晰明了,原生的组件变化点的封装基本都是用的是代理的方式(能够使得使用者,快速的开心的看出来有哪些方法,何时调用)

关于在TabBar 中添加按钮,并通过block 或代理在控制器中实现响应

相信很多朋友会遇到在TabBar中添加按钮,并要求点击按钮能够实现一些功能,但是当我们自定义的时候,怎么才能在控制器中响应?通常我会用代理或者block,block性能更好,建议使用. 自定义TabBar类 .h #import <UIKit/UIKit.h> typedef void(^myBlock) (NSArray *composeButton);//给block起别名,用数组来存放点击的Button @interface ZSTabBar : UITabBar @property (

Block与代理的使用

本人其实是比较喜欢用Block的,因为用block写出来的代码,让我感觉代码要紧凑一些,看起来的时候,思路要清晰些,所以这估计也就是现在block将要代替代理的原因所在吧! 下面,直接进入主题: 一.block block的书写看起来有点怪,其实你只要是懂了其思路,那就非常简单了!我这里就介绍一种初学者最容易记住的使用方法! 写block的时候,1.2.3.4步骤,都是在要传出只的对象中处理,只有最后一步,就是在接收传值的地方处理! 1.在我们传出事件类的.h中,对block进行定义: 2.我们

iOS设计模式-Block实现代理的逻辑

在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通过代理来实现,下面试着通过Block来实现. 在B页面定义Block,供A页面调用. 1 /** 2 * 确认订单选择返回block 3 */ 4 @property (nonatomic, strong) void (^ selectedAddressBlock)(HGAddressModel *

iOS 设计模式-Block实现代理的逻辑

在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通过代理来实现,下面试着通过Block来实现. 在B页面定义Block,供A页面调用. /** * 确认订单选择返回block */ @property (nonatomic, strong) void (^ selectedAddressBlock)(HGAddressModel * address

Block使用详解,Block与代理相比的优点

Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性. Block是Apple Inc.为C.C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包. 闭包就是能够读取其它函数内部变量的函数.就是在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果.所以采用Block技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性. 不像代理声明了一个代理函数,在调用的类内部还要实现该函数,让