1. block
1>block的定义: int (^myBlock)(int , int )=^( int x, int y ) { return x+y ; } 调用: int sum=myBlock(12,23); 此时sum =35 。
2>函数指针的回顾: 定义一个函数 int sum ( int x, int y ) { return x+y ;} 定义函数指针: int (*p) (int x, int y ) ; 此时*p只能指向:返回值为int,并且参数为两个int类型的函数。
使用: p=sum; p(1,2 ); (*p)(2,3); 注意:定义的时候 形参 x,y 可以不写。
2>函数指针别名: typedef (*NewType) (int , int ) ; NewType f1,f2,f3 ; 此处f1 才是函数指针。
3> block类型的typedef:
typedef int (^MyBlock) (int , int ) ; 这样就可以使用MyBlock去定义 类似 int (^BlockA)(int ,int ) 这种结构的block变量。
例如: MyBlock t1; t1 = ^(int x,int y ) { return x+y;} ; int sum =t1(12,12) ; 此时t1 =24;
4>block访问外部变量:block中可以访问外部变量,当使用外部变量的时候,会把外部变量以const的方式复制一份放到内存中(堆区,block存在于堆区)。
block中不允许修改外部变量的值,const方式复制的。
__block int m=10 ; __block 修饰词表示,不再以const的形式复制m 变量。修改内部的局部变量的值,之后打印m的话会使用block的值。
block 可以修改全局变量的值。
5>block的分类:全局block:函数外部定义的block,如果函数内部定义的block,没有引入变量,那么也是全局block
栈block:引入变量的block
堆block: 复制自栈block的,对全局block不会有任何影响,返回的仍然是全局block
6>block 作为函数的参数:
void work( void ^workBlock() ){ workBlock();} void workDay(int n) { work( ^{ NSLog(@"fdkjak") } ;) ; }
7>block作为函数的返回值:
1》使用typedef定义一个新的类型: typedef int(^newType) ( int ,int );
2》使用新定义的类型作为函数的返回值。 newType test(){ return ^(int x , int y ){ return x+y ;} ;}
3》调用: 在main函数中: newType block =test(); block(1,2);
8>block 使用技巧: 使用助记符 inlineblock 可以快速创建block结构。