block 传值 1
2015-09-16 13:55
274 查看
ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。
下面是理论部分:
1、block的定义
其中,定义了一个名字为aBlock的blocks对象,并携带了相关信息:
1、aBlock 有两个形式参数,分别为int类型;
2、aBlock 的返回值为int 类型;
3、等式右边就是blocks的具体实现;
4、^ 带边blocks声明和实现的标示(关键字);
当然,你可以定义其他形式的block。e.g:无返回值,无形式参数等;
2、blocks 访问权限
blocks可以访问局部变量,但是不能修改。
此处不能修改的原因是在编译期间确定的,编译器编译的时候把a的值复制到block作为一个新变量(假设是a‘ = 10),此时a'和a是没有关系的。
这个地方就是函数中的值传递。如果要修改就要加关键字:__block或者static
3、block的调用
block调用就像调用函数一样。e.g:
4、block 应用
假设我们熟悉代理递值的话,对代理我们可能又爱有恨!我们先建立模型A页面 push B页面,如果把A页面的值传递到B页面,属性和单例传值可以搞定!但是如果Pop过程中把B页面的值传递到A页面,那就可以用单例或者代理了!说到代理,我们要先声明协议,创建代理,很是麻烦。常常我们传递一个数值需要在两个页面间写很多代码,这些代码改变页面的整体顺序,可读性也打了折扣。所以,此时,block是一种优化方案!大家累了,休息下,预知后事如何,倾听下回分解...
下面是理论部分:
1、block的定义
1 // 声明和实现写在一起,就像变量的声明实现 int a = 10; 2 int (^aBlock)(int, int) = ^(int num1, int num2) { 3 4 return num1 * num2; 5 6 }; 7 // 声明和实现分开,就像变量先声明后实现 int a;a = 10; 8 int (^cBlock)(int,int); 9 cBlock = ^(int num1,int num2) 10 { 11 return num1 * num2; 12 };
其中,定义了一个名字为aBlock的blocks对象,并携带了相关信息:
1、aBlock 有两个形式参数,分别为int类型;
2、aBlock 的返回值为int 类型;
3、等式右边就是blocks的具体实现;
4、^ 带边blocks声明和实现的标示(关键字);
当然,你可以定义其他形式的block。e.g:无返回值,无形式参数等;
1 void (^bBlock)() = ^() 2 { 3 int a = 10; 4 printf("num = %d",a); 5 4000 };
2、blocks 访问权限
blocks可以访问局部变量,但是不能修改。
1 int a = 10; 2 int (^dBlock)(int) = ^(int num) 3 { 4 a++;//not work! 5 return num * a; 6 };
此处不能修改的原因是在编译期间确定的,编译器编译的时候把a的值复制到block作为一个新变量(假设是a‘ = 10),此时a'和a是没有关系的。
这个地方就是函数中的值传递。如果要修改就要加关键字:__block或者static
1 __block int a = 7; 2 int (^dBlock)(int) = ^(int num) 3 { 4 a++;// work! 5 return num * a; 6 };
3、block的调用
block调用就像调用函数一样。e.g:
假设我们熟悉代理递值的话,对代理我们可能又爱有恨!我们先建立模型A页面 push B页面,如果把A页面的值传递到B页面,属性和单例传值可以搞定!但是如果Pop过程中把B页面的值传递到A页面,那就可以用单例或者代理了!说到代理,我们要先声明协议,创建代理,很是麻烦。常常我们传递一个数值需要在两个页面间写很多代码,这些代码改变页面的整体顺序,可读性也打了折扣。所以,此时,block是一种优化方案!大家累了,休息下,预知后事如何,倾听下回分解...
相关文章推荐
- 轻松自动化---selenium-webdriver(python) (十一)
- OGG实现两台Oracle数据库的同步
- 安装MySQL之后修改编码方式
- 删RAC中间ASM和LISTENER 资源的正确方法
- DFA
- C基础01天——常量变量笔记
- grouping sets,cube,rollup,grouping__id,group by
- flex画图demo
- Swift第三课 分支语句 if else for forin switch while do-while
- 轻松自动化---selenium-webdriver(python) (十)
- 在公司玩的小游戏
- js前端页面常用字段验证(持续更新)
- 扩展欧几里得算法的理解
- POI读取Excel浅谈
- AngularJS使用 ng-options 实现传值给后台controller
- 紫金桥组态软件与西门子S7-200的以太网联接
- 对面向过程、面向对象、类、对象的理解
- 常见的适配器总结
- C++结构体中sizeof
- hive数据库的一些应用