Swift中的逃逸闭包(@escaping )与非逃逸闭包(@noescaping)

article/2025/10/17 11:39:01

逃逸闭包

概念:一个接受闭包作为参数的函数,该闭包可能在函数返回后才被调用,也就是说这个闭包逃离了函数的作用域,这种闭包称为逃逸闭包。当你声明一个接受闭包作为形式参数的函数时,你可以在形式参数前写@escaping来明确闭包是允许逃逸。

例如:当网络请求结束后调用的闭包。发起请求后过了一段时间后这个闭包才执行,并不一定是在函数作用域内执行的。

class ViewController: UIViewController {
​override func viewDidLoad() {super.viewDidLoad()getData { (data) inprint("闭包结果返回--\(data)--\(Thread.current)")}}func getData(closure:@escaping (Any) -> Void) {print("函数开始执行--\(Thread.current)")DispatchQueue.global().async {DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+2, execute: {print("执行了闭包---\(Thread.current)")closure("345")})}print("函数执行结束---\(Thread.current)")}
}

以上代码最后的执行结果为:

从结果可以看出,逃逸闭包的生命周期是长于函数的。

逃逸闭包的生命周期:

1、闭包作为参数传递给函数;

2、退出函数;

3、闭包被调用,闭包生命周期结束

即逃逸闭包的生命周期长于函数,函数退出的时候,逃逸闭包的引用仍被其他对象持有,不会在函数结束时释放。

非逃逸闭包

概念:一个接受闭包作为参数的函数, 闭包是在这个函数结束前内被调用。

例如:

class ViewController: UIViewController {
​override func viewDidLoad() {super.viewDidLoad()handleData { (data) inprint("闭包结果返回--\(data)--\(Thread.current)")}}func handleData(closure:(Any) -> Void) {print("函数开始执行--\(Thread.current)")print("执行了闭包---\(Thread.current)")closure("4456")print("函数执行结束---\(Thread.current)")}
​
}

以上代码最后的执行结果为:

从结果可以看出,非逃逸闭包被限制在函数内。

非逃逸闭包的生命周期:

1、闭包作为参数传给函数;

2、函数中运行改闭包;

3、退出函数。

为什么要分逃逸闭包和非逃逸闭包

为了管理内存,闭包会强引用它捕获的所有对象,比如你在闭包中访问了当前控制器的属性、函数,编译器会要求你在闭包中显示 self 的引用,这样闭包会持有当前对象,容易导致循环引用。

非逃逸闭包不会产生循环引用,它会在函数作用域内释放,编译器可以保证在函数结束时闭包会释放它捕获的所有对象;使用非逃逸闭包的另一个好处是编译器可以应用更多强有力的性能优化,例如,当明确了一个闭包的生命周期的话,就可以省去一些保留(retain)和释放(release)的调用;此外非逃逸闭包它的上下文的内存可以保存在栈上而不是堆上。

综上所述,如果没有特别需要,开发中使用非逃逸闭包是有利于内存优化的,所以苹果把闭包区分为两种,特殊情况时再使用逃逸闭包。


http://chatgpt.dhexx.cn/article/yd7rD4FL.shtml

相关文章

VMware创建Linux虚拟机之(三)Hadoop安装与配置及搭建集群

Hello,world! 🐒本篇博客使用到的工具有:VMware16 ,Xftp7 若不熟悉操作命令,推荐使用带GUI页面的CentOS7虚拟机 我将使用带GUI页面的虚拟机演示 虚拟机(Virtual Machine) 指通过…

hadoop安装及简单的使用

hadoop安装及简单的使用 一、hadoop运行环境搭建二、hadoop 目录结构三、hadoop 本地模式四、hadoop 伪分布式模式五、伪分布式 YARN 运行六、伪分布式启动历史服务器七、伪分布式配置日志的聚集八、hadoop 集群模式 一、hadoop运行环境搭建 1.环境准备 安装 hadoop 需要使用 …

hadoop安装(window10)

一、下载和winutils 1.下载:http://archive.apache.org/dist/hadoop/core/ 官网下载:http://hadoop.apache.org/releases.html (提供最新的几个版本) https://github.com/steveloughran/winutils(windows安装需要&…

Hadoop安装与配置

第一步:装虚拟机 我把hadoop安装需要的文件放在下面大家自行去取: 百度网盘 请输入提取码 提取码:8888 由于centos镜像文件太大传不上去需要的话可以加我qq:364960241 目录 第一步:装虚拟机 第二步:配置静态网络…

基于CentOS虚拟机的Hadoop安装教程(自用备忘)

该博文是用于记录Hadoop的安装过程,且记录其中出现的一些问题,防止日后遗忘 实验环境: 虚拟机:CentOS7Hadoop:3.3.2java:java 8u331下载连接: CentOS:centos-7-x86_64-dvd-2009.iso…

Hadoop安装与配置详细教程

【确保服务器集群安装和配置已经完成!】 前言 请根据读者的自身情况,进行相应随机应变。 我的三台CentOS7服务器: 主机:master(192.168.56.110) 从机:slave0(192.168.56.111&…

Hadoop安装教程 Linux版

Hadoop安装教程 Linux版 一、Linux虚拟机安装 方法一:使用Windows下Linux子系统(大佬可选) 方法二:使用VMware安装Linux虚拟机(小白可选) 方法三:安装双系统(不怕麻烦的可以试试&am…

Ubuntu下的Hadoop安装

二、Hadoop安装 采用版本为hadoop-2.7.7 ①JDK的安装 2.1.1 创建文件夹 sudo mkdir /expt sudo chmod 777 /expt 这个出错我参考别的原因也改过来了, pkexec chmod 0440 /etc/sudoers 2.1.2 移动文件 之前已经解压过了,所以改一下位置就行了 2.1.3 创…

hadoop 安装与测试

1、下载安装包 登录官网hadoop.apache.org 下载安装包 版本可以根据自己的需求进行选择 本文需要下载的安装包是:Hadoop-3.1.3.tar.gz / jdk-14_linux-x64_bin.tar.gz 将Windows上的安装包上传到Linux上,方式有很多。本文是将安装包通过共享文件夹形式…

Hadoop安装目录

/root/software/hadoop-2.6.0-cdh5.15.1/etc/hadoop第一步骤 vi core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop000:8020</value> </property> <property> <name>hadoop.t…

hadoop安装常见问题

目录 SSH服务器拒绝了密码。请再试一次​ ubuntu修改登陆用户名 这样ftp成功链接ubuntu 现在的ubuntu支持直接拖拽文件传输&#xff0c;不用ftp的 yarn是什么 linux配置java环境变量 hadoop安装包下载 linux不能编辑sshd_cofig SSH的简单理解和运用 SSH服务器拒绝了密…

hadoop安装流程

这篇文章主要记录安装hadoop的过程&#xff0c;给后来者一点帮助&#xff0c; 官网获取安装包 选一款你想要的 Apache Hadoop 下载完成后上传到服务器&#xff08;我用的是finalshell&#xff09; 先别急着解压 准备Java包 像上面一样官网下载对应的Java包 这边我已经准…

hadoop安装

hadoop安装 安装模板虚拟机 1) 设置虚拟机IP地址 2) 设置windows虚拟地址 3) 修改OS的IP地址 [roothadoop100 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTOstatic IPADDR # 自己的ip GATEWAY # 自己的网关地址 DNS1 # 自己的dns地址# 一定不要有空格!不要有…

Hadoop 安装与配置

创建虚拟机 这里需要下载ubuntu操作系统 创建一个hadoop用户&#xff0c;并使用/bin/bash 作为shell 虚拟机打开成功后&#xff0c;打开终端Terminal&#xff0c;开始创建hadoop用户 sudo useradd -m hadoop -s /bin/bash 为hadoop设置一个密码 sudo passwd hadoop 为后续操作方…

Hadoop 安装部署

官网下载软件&#xff1a; Ubuntu : https://releases.ubuntu.com/ jdk &#xff1a; https://www.oracle.com/java/technologies/downloads/ Hadoop &#xff1a; https://archive.apache.org/dist/hadoop/common/hadoop-3.3.2/ 下载后上传到服务器&#xff0c;解压 一 1. …

Hadoop的安装与配置(非常重要)

官方的原生配置文档Hadoop3.1.0 HDFS的组成 NameNodesecondaryNameNodeDataNode 这是以主从模式来运行的&#xff0c;前两个在maser节点上&#xff0c;最后一个在slave节点上 1. 解压hadoop安装包 要学会从官方网站里找到历史镜像和release的发布版本来下载 我觉得从别人给的…

hadoop安装教程(一次填完所有的坑)

文章目录 01 引言02 hadoop 安装2.1 下载与安装2.2 hadoop配置2.3 免登陆配置2.4 配置环境变量2.5 配置域名2.6 启动 03 相关命令 3.1 yarn相关命令 3.2 hdfs相关命令 04 一次填完所有的坑05 Yarn相关配置06 文末 01 引言 最近安装hadoop-2.7.7 版本的时候遇到了很多坑&#x…

Hadoop安装部署全分布式搭建

目录 1. 完全分布式模式介绍 2. 平台软件说明 3. 守护进程布局 4. 完全分布式搭建环境准备 4.1. 总纲 4.2. 关闭防⽕墙 4.3. 静态IP和主机名配置 4.4. 配置/etc/hosts⽂件 4.5. 免密登陆认证 4.6. 时间同步 4.6.1. 同步⽹络的时间 4.6.2. ⾃定义时间服务器 4.7. 安装Jdk和Ha…

安装Hadoop集群(超详细!)

提示&#xff1a;安装前请准备好三台装有jdk的虚拟机 我这里名为hd01、hd02、hd03 hd01最好有hadoop和zookeeper的压缩包 文章目录 前言一、准备环境二、安装Hadoop总结 前言&#xff1a; 前面我写了一篇单机版的Hadoop安装&#xff0c;这里终于要装集群版&#xff0c;装集群版…

hadoop的安装过程

Hadoop安装过程 Hadoop基础环境配置 1.1 使用户获得管理员权限 1.2网络环境配置 1.3免密登录 1.4JDK安装Hadoop安装Hadoop配置 3.1在$HADOOP_HOME/etc/hadoop/目录下需要配置以下文件 3.2格式化并启动hadoop 1.HADOOP基础环境配置 1.1 使用户获得管理员权限 1&#xff09;切…