转载自:http://blog.csdn.net/totogo2010/article/details/7839061

代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。

脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:

按照调用函数的方式调用块对象变量就可以了:
int result = myBlock(4); // result是 28

1、参数是NSString*的代码块

  1. void (^printBlock)(NSString *x);
  2. printBlock = ^(NSString* str)
  3. {
  4. NSLog(@"print:%@", str);
  5. };
  6. printBlock(@"hello world!");

运行结果是:print:hello world!

2、代码用在字符串数组排序

  1. NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
  2. NSComparator sortBlock = ^(id string1, id string2)
  3. {
  4. return [string1 compare:string2];
  5. };
  6. NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
  7. NSLog(@"sortArray:%@", sortArray);

运行结果:sortArray:(

    "abc 05",

    "abc 1",

    "abc 12",

    "abc 13",

    "abc 21"

)

3、代码块的递归调用

代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用

  1. static void (^ const blocks)(int) = ^(int i)
  2. {
  3. if (i > 0) {
  4. NSLog(@"num:%d", i);
  5. blocks(i - 1);
  6. }
  7. };
  8. blocks(3);

运行打印结果:

num:3

num:2

num:1

 4、在代码块中使用局部变量和全局变量

在代码块中可以使用和改变全局变量

  1. int global = 1000;
  2. int main(int argc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. void(^block)(void) = ^(void)
  6. {
  7. global++;
  8. NSLog(@"global:%d", global);
  9. };
  10. block();
  11. NSLog(@"global:%d", global);
  12. }
  13. return 0;
  14. }

运行打印结果:

global:1001

global:1001

而局部变量可以使用,但是不能改变。

  1. int local = 500;
  2. void(^block)(void) = ^(void)
  3. {
  4. local++;
  5. NSLog(@"local:%d", local);
  6. };
  7. block();
  8. NSLog(@"local:%d", local);

在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block

  1. __block int local = 500;
  2. void(^block)(void) = ^(void)
  3. {
  4. local++;
  5. NSLog(@"local:%d", local);
  6. };
  7. block();
  8. NSLog(@"local:%d", local);

运行结果:local:501

                    local:501

Block 使用场景的更多相关文章

  1. iOS中Block的基础用法

    本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道 ...

  2. Block 的基本用法

    iOS中Block的基础用法 转载自简书 本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对 ...

  3. iOS中Block使用探索

    Block介绍 Block在ios 4.0之后加入,并大量使用在新的ios api中.block是一个匿名的代码块,可以传递给其他对象的参数,并得到返回值.从本质上讲,block同其他普通的变量类似, ...

  4. OC:Block语法、Block使用、Block实现数组排序

    Block //定义一个求两个数最大值函数 int maxValue (int ,int); //函数的实现 int maxValue (int a, int b){ return  a > b ...

  5. [HMLY]10.iOS中block的基础用法

    本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道 ...

  6. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...

  7. iOS block分析

    block是代码块,其本质和变量类似.不同的是代码块存储的数据是一个函数体.使用Block,就可以像其他标准函数一样,传入参数,并得到返回值. 可以把Block当做Objective-C的匿名函数,B ...

  8. OC-ARC,类扩展,block

    总结 标号 主题 内容 一 autorelease autorelease基本概念/自动释放池/autorelease基本使用 二 autorelease注意事项 注意点/应用场景 三 ARC 什么是 ...

  9. [Objective-c开源库]HHRouter

    ---恢复内容开始--- 目的 统一客户端内部和外部跳转处理,支持传参数 代码 添加vc,block映射 针对路径做映射,如/user/:userId -> UserViewController ...

随机推荐

  1. Python中pip安装问题解决

    用国内镜像通过pip安装python的一些包,有时会出现安装失败, 为什么总是失败?自己操作老标准了,这么简单的几个小步骤还老是出错,不由得让我怀疑是否是撞墙了,可是又懒得买vpn去翻~~一墙,无法代 ...

  2. nmon命令用法

    用途 以交互方式显示本地系统统计信息并以记录方式记录系统统计信息. 语法 交互方式: nmon [ -h ] nmon [ -s < seconds > ] [ -c < count ...

  3. Linux 解决 bash ./ 没有那个文件或目录 的方法

    在Debian 或 ubuntu 64位下运行 ./xxx 会跳出来说没有这个文件或者目录,但是ls看又有这个文件,很是奇怪. 其实原因很简单,是因为他没有32位的运行库 ia32-libs ,直接安 ...

  4. LeetCode OJ 98. Validate Binary Search Tree

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  5. 查看当前目录每个文件的大小(linux)

    du -sh * 查看当前目录每个文件的大小

  6. and的用法(&)

    经常看到jq的源码中各种&连接在一起赋值一个变量, 例一: var b = a&&a.getName 例二: var b = a&&a.getName||d 例 ...

  7. error: invalid 'asm': invalid operand for code 'w'

    google 出结果 http://stackoverflow.com/questions/15623609/including-curl-into-the-android-aosp ........ ...

  8. hh monitor

    http://theholyjava.wordpress.com/2012/09/21/enabling-jmx-monitoring-for-hadoop-and-hive/ http://blog ...

  9. sql server获取当前年月日 时分秒

    获取当前年月日(字符串): ),) 获取当前时间的时分秒(':'隔开): ),) 将年月日时分秒拼接成一条字符串: ),)),),':','')

  10. 转: Ant 脚本的结构化设计

    引言 Ant 脚本是由 Apache 提供的一种基于 Java 的构建工具,为 Java 开发人员所熟悉.Java 开发人员使用 Ant 脚本可以很方便地完成 Java 开发过程中常见的如拷贝文件.创 ...