代理使用原则: 代理方法的参数是要传的值,代理方法的返回值是要得到的值(即要调用的类回传的值),并且在实现的代理方法中的值就是原来的类要传的值(设置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作为函数的参数的时候就是用来传值的。做函数的返回值的时候用来连续操作。

block和代理小结的更多相关文章

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

     iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action)   今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...

  2. iOS block和代理的区别

      block和代理是iOS开发中实现回调的两种方式,大多数情况下是用哪个都可以,主要看个人喜好.本文主要是对两者做一下对比. 1.block简介   在 iOS中, block一共分三种.   (1 ...

  3. IOS中block和代理

    从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockNa ...

  4. iOS之 block,代替代理作为回调函数

    最近在弄一个视频会议的项目,但今天要说的跟视频基本没关系,我们来说一下在一个view中创建一个button,在controller中加载这个view 当button被点击后将时间响应传递给contro ...

  5. iOS开发之巧用Block和代理方法结合来传值

    好久没写技术博客了,因为996的工作周期已经持续好几个月了.每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发.所以博客停歇了这么久,更新率也低了不少,今天补充一 ...

  6. Block与代理的使用

    本人其实是比较喜欢用Block的,因为用block写出来的代码,让我感觉代码要紧凑一些,看起来的时候,思路要清晰些,所以这估计也就是现在block将要代替代理的原因所在吧! 下面,直接进入主题: 一. ...

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

    在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通 ...

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

    相信很多朋友会遇到在TabBar中添加按钮,并要求点击按钮能够实现一些功能,但是当我们自定义的时候,怎么才能在控制器中响应?通常我会用代理或者block,block性能更好,建议使用. 自定义TabB ...

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

    在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通 ...

随机推荐

  1. C#夯实基础之多线程三:线程的优先级

    一.为什么需要优先级--线程调度的问题 在现实生活中,优先级是一个很常见的现象:在火车站,如果你是孕妇,你是可以走进站中的专门绿色通道的,可以提前上火车以免拥挤:火警119匪警110出警的时候,都是人 ...

  2. Django (2)

    一.Django基本   程序编写 a. url.py        /index/    ->   func b. views.py def func(request):     # 包含所有 ...

  3. Reverse Core 第二部分 - 14&15章 - 运行时压缩&调试UPX压缩的notepad

    @date: 2016/11/29 @author: dlive 0x00 前言 周六周日两天在打HCTF2016线上赛,没时间看书,打完比赛接着看~~ 0x01 运行时压缩 对比upx压缩前后的no ...

  4. JAVA基础 Exception, Error

    转载请附上本文地址: http://www.cnblogs.com/nextbin/p/6219677.html 本文参考: JAVA源码 http://swiftlet.net/archives/9 ...

  5. tp5 中 model 的修改器

    修改器可以在数据赋值的时候自动进行转换处理 class User extends Model { public function setNameAttr($value){ return strtolo ...

  6. webuploader在IE8/9下上传遇到的两个问题

    最近在做图片上传功能. 点击一个按钮,弹出一个iframe,它是百度的webuploader插件 在点击关闭按钮时,IE9下总是会报错: __flash__removeCallback未定义错误 解决 ...

  7. javascript 转盘抽奖代码和计数器代码

    要介绍了javascript圆盘抽奖程序实现原理和完整代码例子,需要的朋友可以参考下  看到网页上有不少大转盘抽奖的应用,心血来潮也想弄个.于是找了点资料自己研究...  效果预览: 一.模拟抽奖的实 ...

  8. Redis 外部访问设置

    1.错误原因 Redis搭建好后一般都是使用编程语言进行连接调用,默认Redis的设置是不允许外界访问的,连接Redis只能通过本地(127.0.0.1)来连接,而不能使用网络IP(192.168.1 ...

  9. JavaScript 字符串处理详解

    一.创建字符串       创建一个字符串,将一组字符串用引号包起来,将其赋值给一个字符串变量. var JsStr="Hello,JavaScript String!"; 二.字 ...

  10. vnc远程运行3D游戏

    使用的版本:VNC-5.2.3-Windows.exe   vnc官网 安装的过程中需要输入license key,以下给出一些enterprise license(最大权限的License): K5 ...