Objective

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

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

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

1、参数是NSString*的代码块

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

运行结果是: print:hello world!

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

1NSArray *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、代码块的递归调用

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

1static 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、在代码块中使用局部变量和全局变量

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

1int global = 1000; 2int 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

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

1int 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

著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移

Objective - HelloWorld