原文链接 http://blog.youkuaiyun.com/totogo2010/article/details/7839061
代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。
脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:
按照调用函数的方式调用块对象变量就可以了:
int result = myBlock(4); // result是 28
1、参数是NSString*的代码块
- void(^printBlock)(NSString*x);
- printBlock=^(NSString*str)
- {
- NSLog(@"print:%@",str);
- };
- printBlock(@"helloworld!");
2、代码用在字符串数组排序
- NSArray*stringArray=[NSArrayarrayWithObjects:@"abc1",@"abc21",@"abc12",@"abc13",@"abc05",nil];
- NSComparatorsortBlock=^(idstring1,idstring2)
- {
- return[string1compare:string2];
- };
- NSArray*sortArray=[stringArraysortedArrayUsingComparator:sortBlock];
- NSLog(@"sortArray:%@",sortArray);
"abc 05",
"abc 1",
"abc 12",
"abc 13",
"abc 21"
)
3、代码块的递归调用
代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用
- staticvoid(^constblocks)(int)=^(inti)
- {
- if(i>0){
- NSLog(@"num:%d",i);
- blocks(i-1);
- }
- };
- blocks(3);
num:3
num:2
num:1
4、在代码块中使用局部变量和全局变量
在代码块中可以使用和改变全局变量
- intglobal=1000;
- intmain(intargc,constchar*argv[])
- {
- @autoreleasepool{
- void(^block)(void)=^(void)
- {
- global++;
- NSLog(@"global:%d",global);
- };
- block();
- NSLog(@"global:%d",global);
- }
- return0;
- }
运行打印结果:
global:1001
global:1001
而局部变量可以使用,但是不能改变。
- intlocal=500;
- void(^block)(void)=^(void)
- {
- local++;
- NSLog(@"local:%d",local);
- };
- block();
- NSLog(@"local:%d",local);
- __blockintlocal=500;
- void(^block)(void)=^(void)
- {
- local++;
- NSLog(@"local:%d",local);
- };
- block();
- NSLog(@"local:%d",local);
local:501