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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,828评论 1 32
  • Block的本质 Block是将函数及其上下文封装起来的对象 Block调用 Block调用就是函数的调用 截获变...
    爱玩游戏的iOS菜鸟阅读 816评论 0 4
  • 前言:Block 是开发过程中常用便捷的回调方式,本文简单介绍 Block 一、Block 简介 Block 对象...
    梦蕊dream阅读 4,886评论 5 26
  • 在介绍Block之前通过一个简单的应用场景认识下Block 场景描述如下:TableView上面有多个Custom...
    黑_白_灰阅读 1,508评论 4 29
  • 很事情只有亲身尝试过后才有资格品头论足,学会更好、更全面地做计划,计划有变立刻制定新的计划,行动要迅速。
    以心灵面世阅读 54评论 0 0

友情链接更多精彩内容