block出现之后除了官方原有,几乎很少人再用delegate模式了,很多api也扩展了block模式,block最常见的面试分为:
1.block的基本使用方式
一般来说block都是在回调里面的
void (^block)(int) = ^(int a)
{
NSLog(@"%d",a);
};
block(3);
不过实际开发要复杂的多了,block(3);一般是另一个类来调用,而block本身也会作为一个参数来传递,使用方式和swift的闭包基本一毛一样,不过原理来说根本就不是一回事了
2.block的原理,本质上block是个啥
block本质就是个类,因为它继承自OC对象,说白了就是一个类里面有个函数,只是因为外面进行了封装,搞不清这是个啥,因为会捕获外面的属性/变量等等,所以会导致循环引用
大概内存结构就是存储了isa和一个__block_impl类(里面有isa 和实际的block函数和一些系统内部的变量,)和一些捕获的变量,如上图所示,age就是捕获的值FuncPtr就是实际的函数
所以其实 这个block不是block类的包本身而是,而且__block_impl这个类,而block(3)这段函数就是
block->FuncPtr(3);这就是Block基本的运行原理
3.block捕获机制
int b = 10;
void (^block)(int) = ^(int a)
{
NSLog(@"%d,%d",a,b);
};
block(3);