Block用法解析

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

定义块语法

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

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

定义块变量

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

简单实例

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

局部变量

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

但当为局部变量加上 __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
  1. 看下面代码
    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 *[email protected]"乔布斯";
 NSLogStr(name, ^NSString *(NSString *name) {
     return name;
 });

代码块取代代理传值

时间: 2024-10-07 23:50:27

Block用法解析的相关文章

ObjectiveC中的block用法解析

Block Apple 在C, Objective-C,C++加上Block这个延申用法.目前只有Mac 10.6 和iOS 4有支持.Block是由一堆可执行的程序组成,也可以称做没有名字的Function(Anonymous function).如果是Mac 10.6 或 iOS 4.0 之前的平台可以利用 http://code.google.com/p/plblocks/这个project得以支持Block语法.Apple有一个叫做GCD(Grand Central Dispach)的新

最全面的Java多线程用法解析

最全面的java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); public Thread(Runnab

Objective-C #define 用法解析 (转)

原文地址: http://blog.csdn.net/kindazrael/article/details/8108868 Objective-C : #define 用法解析 在 C 语言中,预处理代码 (Preprocessor) 是非常强大的工具,能让你的代码变得更加易读和易改.利用预处理代码,你可以重新定义代码的一部分,使得你的代码更适合你的风格.预处理代码 (Preprocessor) 在代码编译之前被提前处理.预处理代码均由一个井号 (#) 打头. 1. 关于 #define #de

sql中的group by 和 having 用法解析

--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理.--注意:group by 是先排序后分组:--举例子说明:如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术select DepartmentID as '部门名称',COUNT(*) a

++和+的运算优先级和++i和i++混合用法解析

近日碰到一个技术交流的地方,发现出了一道基础知识的题,刚一看题目确实有点晕,仔细分析如下: int i = 5; int k = i+++(++i)+(++i);           也可以写成(i++)+(++i)+(++i) 其实这个是k=(5++)+(++6)+(++7)=5+7+8=20 得出结果为20 ++和+的运算优先级和++i和i++混合用法解析,布布扣,bubuko.com

extern "c"用法解析

转自: extern "c"用法解析 - 简书 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的.由于C++支持函数重载,因此编译器编译函

WordPress的have_posts()和the_post()用法解析

原文地址:http://www.phpvar.com/archives/2316.html 网上找到一篇介绍WordPress的have_posts()和the_post()用法解析的文章,觉得不错! 在WordPress的index.php文章循环输出中,通常会有下面一段代码: <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <!–PHP代码 –> <?php en

mybatis源码追踪1——Mapper方法用法解析

Mapper中的方法执行时会构造为org.apache.ibatis.binding.MapperMethod$MethodSignature对象,从该类源码中可以了解如何使用Mapper方法. [支持的特殊参数类型] RowBounds.ResultHandler.普通参数 (作为sql执行时使用的变量) 其中普通参数可以是单一的model.查询条件的map或直接将一到多个查询条件作为参数(多个条件在框架中最终将封装为map使用) 另外普通参数支持添加@Param注解以修改参数名,如不修改则参

mysql group by 用法解析(详细)

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而 这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案 下面先来看看例子: