• iOS传值之block传值(一)


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

    下面是理论部分:

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

      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:

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

       4、block 应用

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

  • 相关阅读:
    Linux常用命令英文全称与中文解释
    输入一个URL之后发生了什么?
    四种基本的数据结构
    关于深拷贝
    TCP的三次握手和四次挥手
    利用正则表达式去掉字符串的前后空格
    用canvas画一个等腰三角形
    三种隐藏元素方法的区别
    消息中间件-activemq安全机制
    Netty学习(十)-Netty文件上传
  • 原文地址:https://www.cnblogs.com/Logen/p/3340825.html
Copyright © 2020-2023  润新知