block和代理小结

代理使用原则: 代理方法的参数是要传的值,代理方法的返回值是要得到的值(即要调用的类回传的值),并且在实现的代理方法中的值就是原来的类要传的值(设置delegate=self),

比如2个类 A,B

A类中有个代理方法(int)Adelegate(int a)

B类实现代理方法(int)Adelegate(int a){ return b;}

那么 a是传给B类的值,而b是传给A类的值。

例子:

首先关于代理

@protocol NextViewControllerDelegate<NSObject>

@optional
-(void)passString:(NSString *)text;

@end

@interface NextViewController : UIViewController

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

@end

.m文件中

if ([self.delegate respondsToSelector:@selector(passString:)]) {
        [self.delegate passString:self.backBtn.titleLabel.text];

}

另一个类中

nvc.delegate=self;

#pragma mark -delegate
-(void)passString:(NSString *)text
{
    self.name.text= text;

}

1.biock被定义成属性的时候

typedef void(^passString)(NSString *text);
@interface NextViewController : UIViewController

@property (nonatomic,copy) passString passStr;

@end

.m中

if (self.passStr) {
        self.passStr(self.backBtn.titleLabel.text);

}

另一个类中

nvc.passStr=^(NSString *text){
        self.name.text=text;

};

那么block和代理的作用几乎一样,就是在自己类中声明和调用,实现是在别的类中。

2.如果block在自己类中声明了,同时作为函数的参数了,作用和代理也差不多,调用的时机依旧是在别的类中了控制的。

typedef void(^passString)(NSString *text);

@interface NextViewController : UIViewController

-(void)passStr:(passString)passStr;

@end

.m文件中

-(void)passStr:(passString)passStr
{
    if (passStr) {
        passStr(self.backBtn.titleLabel.text);

}

}

另一个类中

[nvc passStr:^(NSString *text) {
        self.name.text=text;

}];

3.用block实现的链式调用

如果是一个类的属性或对象方法那么可以用. 点出来

如果点出来还能带参数,就是+()那么这个属性或者对象发放必须是函数指针或者就是block的类型或返回值。

如果要连续的点出来,那么就是说要函数指针或block返回的是指向自己的类型。

所以如下:

@interface WXChainManager : NSNumber

-(WXChainManager * (^)(int a))add;//add不可以带参数,在调用的时候带参数。此时add更像是一个block或函数指针;

@end

.m中

-(WXChainManager * (^)(int a))add
{
    return ^(int a){
        NSLog(@"%d",a);
        return self;
    };

}

其他类中调用

chain.add(10).add(22).add(33);

结果:

2016-05-31 15:27:56.936 使用block链式调用[2367:292422] 10

2016-05-31 15:27:56.936 使用block链式调用[2367:292422] 22

2016-05-31 15:27:56.937 使用block链式调用[2367:292422] 33

 

下面是个简单的加法链式计算:

typedef WXChainManager * (^calculator)(int a);

@interface WXChainManager : NSNumber

@property (nonatomic,assign) int result;
@property (nonatomic,copy) calculator add;

@end

。m中

//就是add的getter方法

-(calculator)add
{
    return ^(int a){
        self.result=self.result+a;
        return self;
    };

}

使用:

WXChainManager *chain=[[WXChainManager alloc] init];
    int reslut= chain.add(10).add(22).add(33).result;

NSLog(@"%d",reslut);

2016-05-31 15:37:56.956 使用block链式调用[2367:292422] 65

 

总结:block作为函数的参数的时候就是用来传值的。做函数的返回值的时候用来连续操作。

时间: 2024-08-06 07:36:42

block和代理小结的相关文章

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

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

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

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 *

block和代理使用对比

demo设计:做简单的抽奖,在viewcontroller中调用代理和block去获得抽奖号码,在viecontroller中打印出来. 代理类的.h文件 @protocol DelegateClassDelegate; @interface DelegateClass : NSObject @property(nonatomic,weak) id<DelegateClassDelegate> delegate; -(void)dosomthing; @end @protocol Delega

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技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性. 不像代理声明了一个代理函数,在调用的类内部还要实现该函数,让