iOS传值之block传值(一)

  ios4.0系统已开始支持block,在编程过程当中,blocks被Obj-C当作是对象,它封装了一段代码,这段代码能够在任什么时候候执行。Blocks能够做为函数参数或者函数的返回值,而其自己又能够带输入参数或返回值。它和传统的函数指针很相似,可是有区别:blocks是inline的,而且它对局部变量是只读的。ios

下面是理论部分:编程

  一、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对象,并携带了相关信息:优化

  一、aBlock 有两个形式参数,分别为int类型;spa

  二、aBlock 的返回值为int 类型;代理

  三、等式右边就是blocks的具体实现;指针

  四、^ 带边blocks声明和实现的标示(关键字);code

      固然,你能够定义其余形式的block。e.g:无返回值,无形式参数等;对象

1         void (^bBlock)() = ^()
2         {
3             int a = 10;
4             printf("num = %d",a);
5         };    

  二、blocks 访问权限blog

  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         };

  三、block的调用

  block调用就像调用函数同样。e.g:

   int c = aBlock(10,10); 
  bBlock();

   四、block 应用

  假设咱们熟悉代理递值的话,对代理咱们可能又爱有恨!咱们先创建模型A页面 push B页面,若是把A页面的值传递到B页面,属性和单例传值能够搞定!可是若是Pop过程当中把B页面的值传递到A页面,那就能够用单例或者代理了!说到代理,咱们要先声明协议,建立代理,非常麻烦。经常咱们传递一个数值须要在两个页面间写不少代码,这些代码改变页面的总体顺序,可读性也打了折扣。因此,此时,block是一种优化方案!你们累了,休息下,预知后事如何,倾听下回分解...

相关文章
相关标签/搜索