美文网首页
ios-面试-block

ios-面试-block

作者: 简鱼7819 | 来源:发表于2019-12-16 18:14 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/rldigctx.html