#import <Foundation/Foundation.h>
// 定义一个叫做MyBlock的类型
// 利用MyBlock类型可以定义block变量
// 利用MyBlock类型定义出来的变量, 存储的代码必须返回int, 必须接受2个int类型的参数
typedef int (^myBlock)(int ,int);
void test()
{
// 定义一个block计算两个整数的和
int (^sumBlock)(int, int) = ^(int num1, int num2) {
return num1 + num2;
};
// int -返回值 - (int,int) 形参
int (^myBlock1)(int,int) = ^(int num1,int num2)
{
NSLog(@"num + num --- %d",num1 + num2);
return num1 + num2;
};
NSLog(@"slssl -- %d", myBlock1(10,20));
}
int main(int argc, const char * argv[])
{
@autoreleasepool
{
// myBlock 类型 v1变量名
myBlock v1 = ^(int n1, int n2)
{
return n1 + n2;
};
NSLog(@"n1 + n2 === %d",v1(10,1));
}
return 0;
}
一个Block的内部时可以引用自身作用域外的变量的,包括static变量,extern变量或自由变量(定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量auto,auto变量保存在stack中的。除了auto之外还存在register,static等存储修饰符),对于自由变量,在Block中只读的。在引入block的同时,还引入了一种特殊的__block关键字变量存储修饰符。
代码块本质上与变量一样,都在函数中声明然后使用,只不过一个变量中存储一个值,一个代码块存储一个函数体(一段代码);
代码块的定义:有返回值,有参数,有变量名;
__block关键字 修饰局部变量,使局部变量变得特殊,可以在block代码块中使用:
把全局变量和局部变量作为参数传递到一个函数中,这个变量会copy一份传入到函数,函数中做的操作不会影响变量的值(根本就是两个东西)。
把全局变量和局部变量作为参数传递到一个代码块中,局部变量必须要__block来修饰,用来告诉编译器这个局部变量有些特殊可以在代码中使用,这些变量在代码块中使用就是本来的变量。