美文网首页iOS开发
Block相关知识

Block相关知识

作者: huoshe2019 | 来源:发表于2019-10-16 16:28 被阅读0次
Block体系

一、Block本质

1.1、概念

Block是将函数及其执行上下文封装起来的对象

问题1:什么是Block?

Block是将函数及其执行上下文封装起来的对象

Block

问题2:什么是Block调用?

Block调用就是函数调用

1.2、代码转换指令

编译命令

二、Block截获变量

问题2:截获变量面试题

截获变量
答案是12

2.1、截获变量类型分类

截获类型 截获特性

问题3:关于Block的截获变量特性怎么理解?

从截获类型和截获特性进行解释(见上图)。

三、__block修饰符

3.1、赋值和使用的区别

使用
不需要使用__block

使用

赋值
需要使用__block

赋值

3.2、使用场景细分

问题4:什么场景使用__block修饰符?

__block使用场景 使用__block 不使用__block

问题5:__block笔试题

__block修饰基本数据类型
解释原因:
1、__block修饰的变量变成了对象,如下:
对象模型

2、后面使用的multiplier都是结构体里面的,通过forwarding指针引用,如下:

forwarding

3、又因为在Block在栈上,__block的forwarding指针指向自己,如下图:

4、所以这里修改的multiplier也就是修改上的变量。而Block在栈上,所以使用的也是栈上的变量

补充:__block在ARC和MRC区别

  • MRC 环境下,block 截获外部用 __block 修饰的变量,不会增加对象的引用计数
  • ARC 环境下,block 截获外部用 __block 修饰的变量,会增加对象的引用计数

四、Block内存管理

4.1、Block类型

Block类型

4.2、Block内存区域

Block内存区域

4.3、Block的Copy操作

Block的Copy操作

注意:
对Block的Copy操作理解,会将Block从放到上,防止使用的时候,Block被销毁。
所以,一般声明的Block成员变量关键字是Copy。

4.4、栈上Block的销毁

栈上Block的销毁

4.5、栈上Block的Copy

问题6:当把栈上的Block进行Copy操作之后,在MRC环境下,是否会引起内存泄漏?

是的

4.6、栈上__block变量的Copy

栈上__block变量的Copy

所以一旦被Copy到堆上,即使代码表面上是修改上的__block变量,其内在本质是修改上的__block变量。

例题实战

例题实战
  • _blk进行了Copy操作,里面的multiplier用的是上的。
  • multiplier = 6其实是通过上的forwarding修改上的multiplier
  • 结果是 4 * 6 = 24。

4.7、forwarding指针总结

总结
  • 如果没有对__block进行Copy操作,就是操作栈上的__block变量。
  • 如果发生了Copy操作,无论是在栈上还是在堆上,都是操作堆上的__block变量。

五、Block循环引用问题

问题7:以下代码有什么问题?

题目

有循环引用
原因:

  • 根据Block截获变量的特性,对于对象,会将所有权修饰符一起截获。
  • 这里对象持有Block,又因为array是strong,所以Block对array也是strong

解决办法:

解决办法
  • 也是从截获变量特性解释

问题8:以下代码有问题吗?

循环引用
答案:
答案

解释:
在ARC情况下

ARC

解决办法:

解决办法

问题9:为什么Block会产生循环引用?

从截获变量特性进行答题

问题10:怎样理解Block截获变量对特性?

理解

问题11:你遇到过哪些循环引用?你又是怎样解决的?

  • NSTimer
  • Block

相关文章

  • Block 初见

    Block 初见 介绍 iOS block 的相关知识 目录 Block 背景知识 Block 使用方式 Bloc...

  • Block相关知识

    一、Block本质 1.1、概念 Block是将函数及其执行上下文封装起来的对象。 问题1:什么是Block? B...

  • Block 相关知识

    1、什么是block 2、block截获对象 3、在什么情况下需要使用__block修饰符? 4、为什么block...

  • Block相关(二)

    前言,在上篇文章Block相关(一),中介绍了Block相关的基础知识,包括Block介绍、基础语法、使用情况等。...

  • ios -- block相关知识

    所有的Block里面的self必须要weak一下? 很显然答案不都是,有些情况下是可以直接使用self的,比如调用...

  • iOS基础:block 内如何修改 block 外部变量

    block 原理已有很多优秀的博客介绍过了,这里是对 block 相关知识的复习巩固 在 block 内部修改其外...

  • Block知识小结

    这篇博客将系统整理一下Block相关的知识 首先,先思考一个问题Block能做些什么? Block内部能够读取外部...

  • iOS笔记--Block相关知识

    Block介绍(一)基础Block介绍(二)内存管理与其他特性block介绍(三)揭开神秘面纱(上)block介绍...

  • iOS相关知识(六)-- block

    1、block的本质 2、block的变量捕获(capture) 为了保证block内部能够正常访问外部的变量,b...

  • 21·iOS 面试题·__block 在 ARC 和 MRC 下

    前言 对于 Block 以及 __block 相关的知识点,之前的面试题已经涉及过:04·iOS 面试题·Bloc...

网友评论

    本文标题:Block相关知识

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