block本质上也是一个OC对象,它内部也有个isa指针
block是封装了函数调用以及函数调用环境的OC对象
block是封装函数及其上下文的OC对象
一、block定义
//直接定义
@property(nonatomic,copy)void(^block)(NSInteger);
//方法中定义
-(void)setWithblock:(void(^)(NSInteger index))block;
//其他定义
typedefvoid(^Block)(NSInteger index);
@property(nonatomic,copy)Block block;
系统的block使用
block定义二、block捕获问题
1,对于 基本数据 类型 的 局部变量 截获 其值;
2,对于对象类型 的 局部变量 连同其 所有权修饰符一起截获;
3,局部静态变量 以 指针形式 截获 ;
4,不截获全局变量和静态全局变量 直接访问;
三、block循环引用
(1)__block
在ARC 和 MRC都可以使用,可以修饰对象,也可以修饰基本数据类型,可以在block中重新赋值。
(2)__weak
弱引用,只能在ARC下使用,只能修饰对象类型,在block中 只能使用不能修改。
(1)__strong
强引用,防止block中的对象 由于弱引用 被释放。
(why为什么block要变量捕获):为了保证block内部能够正常访问外部变量。
(why为什么局部变量需要捕获):考虑作用域的问题,需要跨函数访问,所以全局变量直接采用对应的变量值,静态变量因为数据值保存内对堆栈里,可以直接用指针访问到。
Q:block里访问self是否会捕获?
会,self是当调用block函数的参数,参数是局部变量,self指向调用者
Q:block里访问成员变量是否会捕获?
会,成员变量的访问其实是self->xx,先捕获self,再通过self访问里面的成员变量
上面内容还是block中比较浅显的知识,后面更细致更深的知识请看下面三个链接。
我准备自己有空跟着三个链接实现一遍。
记录~分享~
参考链接
面试问到block不会的,看懂这三篇,基本上没多大问题了。
1,https://www.jianshu.com/p/e8f4d7894505
网友评论