c/c++语言开发共享Block用法解析

block代码块是对c做出的一个补充,初次体验代码块,无比的不适应。古怪的语法确实让人不易入门甚至精通。但若能够深入精通block的使用,会给代码带来层次上的提升。block


block代码块是对c做出的一个补充,初次体验代码块,无比的不适应。古怪的语法确实让人不易入门甚至精通。但若能够深入精通block的使用,会给代码带来层次上的提升。block就是一段在将来被执行的代码

定义块语法

      ^[块返回值类型](形参类型1 形参1,形参类型2  形参2,...)      {      //块执行任务      }  

需要注意的是定义块必须以^开头

定义块变量

  块返回值类型  (^块变量名)(形参类型1,形参类型2,...);  

简单实例

       //定义块变量      void(^nslogstr)();     //通过块变量调用块      nslogstr=^(void)      {      };
       //定义无返回值不带参数     void (^nslogstr)()=^()      {          //代码块实现的方法          nslog(@"hello block");      };      //通过代码变量调用代码块      nslogstr();

局部变量

在默认状态,当用块访问局部变量的值时候,是不允许修改局部变量的。

c/c++语言开发共享Block用法解析

但当为局部变量加上 __block修饰就可以修改局部变量

   __block int a=10;       void (^nslogstr)()=^()      {          //读取局部变量a,是可以的          nslog(@"%d",a);          //试图修改局部变量,错误的。无法运行通过          a=20;          nslog(@"%d",a);            nslog(@"hello block");      };      //通过代码变量调用代码块      nslogstr();  
  2016-05-01 16:20:23.860 [2470:103092] 10  2016-05-01 16:20:23.861 [2470:103092] 20  2016-05-01 16:20:23.861 [2470:103092] hello block

看下面代码

      int a=10;       void (^nslogstr)()=^()      {          //读取局部变量a,是可以的          nslog(@"%d",a);          nslog(@"hello block");      };      a=30;      //通过代码变量调用代码块      nslogstr();        nslog(@"%d",a);

猜猜应该打印的值是多少?两个a都是30?

  2016-05-01 16:27:57.600 [2543:107259] 10  2016-05-01 16:27:57.601 [2543:107259] hello block  2016-05-01 16:27:57.601 [2543:107259] 30

why?

原来,在定义代码块时就已经把局部变量的值复制到块 。所以即使在定义后、调用前修改局部变量,依然是没有用的。 倘若我们我们想等到执行时才去访问获取甚至去修改局部变量的值,我们可以在局部变量前面加__block

block高级用法

代码块作为函数的参数(只能当函数的最后一个参数)

这时候我们需要引入一个typedef用typedef可以定义代码块类型,主要有两个作用

复用块变量类型,使用块变量类型可以重复定义多个块变量

使用块变量类型定义函数参数,这样可定义带块参数的函数

  typedef 块返回值类型(^块变量类型)(形参类型1,形参类型2,....);  

定义一个函数,block作为函数最后一个参数

  typedef nsstring* (^logstr)(nsstring *);    void nslogstr(nsstring *name,logstr log)  {      nslog(@"%@%@",log(name),@",欢迎您");  }  调用:     nsstring *name=@"乔布斯";   nslogstr(name, ^nsstring *(nsstring *name) {       return name;   });

代码块取代代理传值

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/603550.html

(0)
上一篇 2021年5月11日
下一篇 2021年5月11日

精彩推荐