OC加强3

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结构。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章