ios-面试-block

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

2,https://www.jianshu.com/p/4e79e9a0dd82

3,http://www.cocoachina.com/articles/23147

你可能感兴趣的:(ios-面试-block)