Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其它的函数或者Block。
第一部分:Block基本的声明与实现
Block声明形式如下:
返回值类型(^Block名)(参数列);
返回值类型(比如void,int等),Block名即自己为这个Block取得名字,参数列(比如 int a, int b, int c)如果没有参数列要写成: ()。
Block实体形式如下:
^(传入参数列){行为主体};
Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列最好要写成: ^(void)。
1.先来看一个最简单的例子
//先声明再实现行为主体
void(^aBlock)(NSString *x);
aBlock=^(NSString *x)
{
NSLog(@"%@",x);
};
aBlock(@"hello world!");
当然也可以在声明的同时实现行为主体
//无返回值和参数
void(^aVoidBlock)()=^(void)
{
NSLog(@"i am a aVoidBlock");
};
aVoidBlock();
//有返回值和参数
int a=3;
int(^myBlock)(int)=^(int num)
{
return num*a;
};
int result=myBlock(9);
NSLog(@"result==%d",result);
2.如果只是上面这些,Block也就没有那么吸引人了,除了这些之外,Block和可以作为函数的参数进行传递
下面来看一个小例子:
首先,定义一个我们需要的代码块新类型MainBlock,是这样的
typedef int(^MainBlock)(int x,int y);
然后写一个方法,该方法的参数类型就是我们定义的新类型MainBlock
-(void)useCodeBlockint:(MainBlock)block
{
int result=block(300,200);
NSLog(@"result======%d",result);
}
之后就可以调用该方法并且可以给它传MainBlock类型的参数
MainBlock sendBlock=^(int x,int y)
{
return x+y;
};
[self useCodeBlockint:sendBlock];
第二部分:代码块如何访问局部变量和全局变量