block的使用

来源:互联网 发布:黑桐谷嫂的淘宝店 编辑:程序博客网 时间:2024/04/28 20:16

1.闭包就是能够读取其它函数内部变量的函数

2.Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似

3.block的几种适用场合:

  • 任务完成时回调处理
  • 消息监听回调处理
  • 错误回调处理
  • 枚举回调
  • 视图动画、变换
  • 排序

int (^sumBlock)(int, int) = ^(int num1, int mun2){

        return num + num2;

  }; //block使用^来修饰,第一个int表示block返回整形值,括号里的(int,int)表示传入两个整形参数

or

int (^sumBlock)(int, int);

sumBlock = ^(int num1, int mun2){

  return num + num2;

}

4.block如何申明(对比于c语言中的函数申明) 

5.c函数指正和blocks调用 
     int (*CFunc) (int a) 函数调用 
     int result = CFunc(10); 
     int (^BFunc)  (int  a)  函数调用 
     int result = BFunc(10); 

6.__block  关键字 
     一个Block的内部时可以引用自身作用域外的变量的,包括static变量,extern变量或自由变量(定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量auto,auto变量保存在stack中的。除了auto之外还存在register,static等存储修饰符),对于自由变量,在Block中只读的。在引入block的同时,还引入了一种特殊的__block关键字变量存储修饰符。 

7.对作用域内变量的引用:
int main(int argc, const char * argv[]){    @autoreleasepool {        int localCounter = 42;        __block char localCharacter;        void (^aBlock)(void) = ^(void){            localCharacter = 'a';            NSLog(@"localCounter is %d,localCharacter is %c", localCounter, localCharacter);        };                localCounter = 100;        localCharacter = 'A';            NSLog(@"localCounter is %d,localCharacter is %c", localCounter, localCharacter);        //result is localCounter is 100,localCharacter is A        aBlock(); //result is localCounter is 42,localCharacter is a        NSLog(@"localCounter is %d,localCharacter is %c", localCounter, localCharacter);        //result is localCounter is 100,localCharacter is a    }    return 0;}
程序运行后会再遇到(void)(^aBlock)(void)是会将locationCounter的值记住,但不会运行函数体。

当调用aBlock()时,会执行,block中的locationCounter一旦赋值就不可变了,只读。而locationCharacter由于设置成了__block 类型所以可以改变。

原创粉丝点击