image.png
iOS代码块Block
一:概述
闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」;Block 是 Objective-C 对于闭包的实现。
代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量、作为参数、作为返回值,特殊的Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD、动画、排序及各类回调。
其中,Block:
1:可以嵌套定义,定义 Block 方法和定义函数方法相似。
2:Block 可以定义在方法内部或外部。
3:只有调用 Block 时候,才会执行其{}体内的代码。
4:本质是对象,使代码高聚合。
使用 clang 将 OC 代码转换为 C++ 文件查看 block 的方法:
1:在命令行输入代码 clang -rewrite-objc 需要编译的OC文件.m
2:这时查看当前的文件夹里 多了一个相同的名称的 .cpp 文件,在命令行输入
open main.cpp 查看文件
二:Block定义
1.无参数无返回值
//无参无返回值
void (^myBlock) (void) = ^{
NSLog(@"无参无返回Block");
};
myBlock(); // block的调用
2.有参数无返回值
void (^myBlock3) (int a) = ^(int a){
NSLog(@"a == %d, 我就是有参数无返回值的block", a);
};
myBlock3(100); // //调用block
//控制台打印结果:a == 100, 我就是有参数无返回值的block
3.有参有返回值
//有参有返回值的block
int (^myBlock4)(int , int) = ^(int a, int b){
NSLog(@"-- %d, 我就是有参数有返回值的block", a +b);
return (a +b);
};
myBlock4(30 , 20); // //调用block
// 控制台打印结果:50, 我就是有参数无返回值的block
4.无参数有返回值的block(实际中很少用到)
//无参有返回值的block
int (^myBlock5)(void) = ^{
NSLog(@"我是一个无参数, 有返回值的block");
return 100;
};
myBlock5();
5.实际开发中常用typedef 定义Block。
例如:
image.png
//typedef 定义有参数有返回值的block
typedef int (^MyBlock3)(int c, int d);
这时,MyBlock3就成为了一种Block类型。
在定义类的属性时可以这样:
//block 修饰 作为属性
@property (nonatomic, copy) MyBlock3 threeBlock;
使用该block时:
//使用block
self.threeBlock = ^int(int c, int d) {
NSLog(@"block的返回值 == %d",c*d);
return c*d;
};
self.threeBlock(10, 20);
三:Block与变量
1.block 中可以访问局部变量
int a = 10;
void (^myBlock)(void) = ^{
NSLog(@"a的值为:%d", a);
};
myBlock();
//控制台输出结果:a的值为10
2.在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之前的旧值
int a = 10;
void (^myBlock)(void) = ^{
NSLog(@"a的值为:%d", a);
};
a = 20;
// 调用后控制台输出"a的值为:10"
myBlock();
3.在Block中不可以直接修改局部变量
int a = 10;
void (^myBlock)(void) = ^{
// a++; //这一句报错
NSLog(@"a的值为:%d", a);
};
myBlock();
4.Block内访问__block修饰的局部变量
在局部变量前使用__block修饰,在声明Block之后、调用B