Swift——自动引用计数ARC
ARC
ARC是swift使用的一种管理应用程序内存的机制,对于C语言我们知道,当我们申请一块空间,通常需要手动释放,不然会造成空间浪费,而有了ARC机制,你无需考虑内存的管理,因为ARC会在类的实例不再被使用时,自动释放内存空间。
ARC通常适用引用类型,比如类。
自动引用计数的规则:
- 每创建一个类的实例对象,ARC就分配一块内存存储实例信息,引用计数+1
- 当实例不再被使用,ARC自动释放实例所占内存,引用计数-1
- 当引用计数为0时,实例被销毁。
类实例之间的循环强引用
循环强引用:两个类实例都持有一个强引用的指向对方的属性
解决循环强引用方法:类之间的关系使用弱引用代替强引用。
循环强引用示例:
class A{let aStr:Stringvar b:B?init(a: String) {self.aStr = a}deinit{print("A's deinit")}
}class B{var bStr:Stringvar a:A?init(str:String){self.bStr = str}deinit {print("B's deinit")}
}var objA:A?
var objB:B?objA = A(a: "AAAA")
objB = B(str: "BBBB")objA!.b = objB
objB!.a = objAobjA = nil
objB = nil
//由于objA.b还指向B,objcB.a还指向A所以两者的实例还未被释放,此时打印无结果
此时如果要释放A和B只能这么做:
一般解决该办法之一是通过弱引用weak,弱引用不会增加ARC计数。
因此可以改成:
class A{let aStr:Stringweak var b:B?//使用弱引用init(a: String) {self.aStr = a}deinit{print("A's deinit")}
}class B{var bStr:Stringweak var a:A?//使用弱引用init(str:String){self.bStr = str}deinit {print("B's deinit")}
}var objA:A?
var objB:B?objA = A(a: "AAAA")
objB = B(str: "BBBB")objA!.b = objB
objB!.a = objAobjA = nil//此时A释放
objB = nil//此时B释放
无主引用Unowned
解决循环引用的另一种方式就是无主引用,无主引用修饰的实例属性与引用它的实例有着相同的生命周期
- 在声明属性或者变量时,在前面加上关键字
unowned
表示这是一个无主引用 - 使用无主引用,必须确保引用始终指向一个未销毁的实例,这也意味着无主引用的对象有确定的值。
- 如果试图在实例被销毁后,访问该实例的无主引用,会触发运行时错
class A{let aStr:Stringvar b:B?//使用弱引用init(a: String) {self.aStr = a}deinit{print("A's deinit")}
}class B{var bStr:Stringunowned var a:A?//使用弱引用init(bStr: String, a: A? = nil) {self.bStr = bStrself.a = a}deinit {print("B's deinit")}
}var objA:A?objA = A(a: "AAAA")objA!.b = B(bStr: "bbbb",a:objA)objA = nil
//这里会释放A和B,因为B里的a是无主引用,类似于弱引用,这样就没有指向A的对象了,A被释放,A里面的b也被销毁,指向B的对象也没有了,B被释放
闭包引起的循环强引用
将一个闭包赋值给类实例的某个属性,并且这个闭包体中又使用了这个类实例时。这个闭包体中可能访问了实例的某个属性,或者闭包中调用了实例的某个方法,这两种情况都导致了闭包“捕获”self,从而产生了循环强引用。
例如:
class A{let aStr:Stringlet isShow:Boollazy var closures:()->String = {if self.isShow {return self.aStr}else{return "isShow is False"}}init(aStr: String, isShow: Bool) {self.aStr = aStrself.isShow = isShow}deinit{print("A's deinit")}}var objA:A?
objA = A(aStr: "AAAA", isShow: true)var value:String = objA!.closures()
print(value)objA = nil
解决办法跟类实例循环引用方法一样,声明每一个捕获引用为弱引用或者无主引用。
- 弱引用:在被捕获的引用可能会变为nil时,将闭包内的捕获定义为弱引用
- 无主引用 :在闭包和捕获的实例总是互相引用并且总是同时销毁时,将闭包内的捕获定义为无主引用
- 如果被捕获的引用绝对不会变为nil,应该用无主引用,而不是弱引用
示例:
class A{let aStr:Stringlet isShow:Boollazy var closures:()->String = {//捕获列表是[unowned self],表示将self捕获为无主引用而不是强引用[unowned self] inif self!.isShow {return self!.aStr}else{return "isShow is False"}}init(aStr: String, isShow: Bool) {self.aStr = aStrself.isShow = isShow}deinit{print("A's deinit")}}var objA:A?
objA = A(aStr: "AAAA", isShow: true)var value:String = objA!.closures()
print(value)objA = nil
//这里会释放A
相关文章:

Swift——自动引用计数ARC
ARC ARC是swift使用的一种管理应用程序内存的机制,对于C语言我们知道,当我们申请一块空间,通常需要手动释放,不然会造成空间浪费,而有了ARC机制,你无需考虑内存的管理,因为ARC会在类的实例不再…...
【Quarkus】基于CDI和拦截器实现AOP功能(进阶版)
Quarkus 基于CDI和拦截器实现AOP功能(进阶版) 拦截器的属性成员拦截器的重复使用基于属性成员和重复使用的拦截器的发消息案例 本节来了解一下拦截器高级特性(拦截器的重复使用和属性成员),官网说明:https:…...
【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决
前言 在日常开发和运维中,为了提高服务器登录的安全性,我们通常会选择使用 SSH 密钥认证 来替代传统的密码登录。然而,在配置 SSH 公钥登录的过程中,可能会遇到各种坑和 Bug。本文将从零开始,手把手教你如何在 Ubuntu…...

insmod一个ko提供基础函数供后insmod的ko使用的方法
一、背景 在内核模块开发时,多个不同的内核模块,有时候可能需要都共用一些公共的函数,比如申请一些平台性的公共资源。但是,这些公共的函数又不方便去加入到内核镜像里,这时候就需要把这些各个内核模块需要用到的一些…...

七、传统循环神经网络(RNN)
传统循环神经网络 RNN 前言一、RNN 是什么?1.1 RNN 的结构1.2 结构举例 二、RNN 模型的分类2.1 按照 输入跟输出 的结构分类2.2 按照 内部结构 分类 三、传统 RNN 模型3.1 RNN内部结构图3.2 内部计算公式3.3 其中 tanh 激活函数的作用3.4 传统RNN优缺点 四、代码演示…...

LeetCode:19.删除链表倒数第N个节点
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:19.删除链表倒数第N个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表…...

【RISC-V CPU debug 专栏 2 -- Debug Module (DM), non-ISA】
文章目录 调试模块(DM)功能必须支持的功能可选支持的功能兼容性要求规模限制Debug Module Interface (DMI)总线类型地址与操作地址空间控制机制Debug Module Interface Signals请求信号响应信号信号流程Reset Control复位控制方法全局复位 (`ndmreset`)Hart 复位 (`hartreset…...

单片机学习笔记 11. 外部中断
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...

基于stm32的智能教室管理系统/智能家居系统
基于stm32的智能教室管理系统/智能家居系统 持续更新,欢迎关注!!! ** 基于stm32的智能教室管理系统/智能家居系统 ** 目前,物联网已广泛应用在我们的生活中。智慧校园是将校园中的生活、学习、工作等相关的资源联系在一起,实现管理的智能化…...
基于 Qt 和 GStreamer 的环境中构建播放器
一、功能与需求分析 功能描述 播放本地视频文件(如 MP4、MKV)。 支持基本控制功能(播放、暂停、停止、跳转)。 提供音量调节功能。 在 Windows 环境下使用 Visual Studio 2022 编译。 技术选型 Qt:用于构建用户界面。 GStreamer:负责视频解码和播放。 Visual Studio 202…...
windows docker 入门
这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步:安装Docker Desktop for Windows 系统要求: Windows 10 64位版本(专业版、企业版或教育版)。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…...
baomidou Mabatis plus引入异常
1 主要异常信息 Error creating bean with name dataSource 但是有个重要提示 dynamic-datasource Please check the setting of primary 解决方法: <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring…...
深度学习中的正则化模型是什么意思?
一、定义 在深度学习中,正则化是一种用于防止过拟合的技术。过拟合是指模型在训练数据上表现非常好,但在新的、未见过的数据(测试数据)上表现很差的情况。正则化模型就是通过在损失函数中添加额外的项来约束模型的复杂度…...

修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题
之前很多配置都是放在nacos里面,然后这次同事有个配置写在application.properties中,这个配置含有中文,启动之后发现拿到的中文值会乱码,然后就帮忙看了一下问题。 排查问题 经过不停的百度、排查发现,spring读取app…...
Flink 热存储维表 使用 Guava Cache 减轻访问压力
目录 背景 Guava Cache 简介 实现方案 1. 项目依赖 2. Guava Cache 集成到 Flink (1) 定义 Cache (2) 使用 Cache 优化维表查询 3. 应用运行效果 (1) 维表查询逻辑优化 (2) 减少存储压力 Guava Cache 配置优化 总结 背景 在实时计算场景中,Flink 应用中…...
深入探索SenseVoiceSmall:高效多语言语音识别与处理模型
引言 随着人工智能技术的飞速发展,语音识别技术已经广泛应用于智能助手、客户服务、智能家居等多个领域。然而,现有的语音识别模型往往存在资源消耗大、多语言支持不足等问题。今天,我们要介绍的是来自ModelScope平台的SenseVoiceSmall模型&…...

Flink--API 之Transformation-转换算子的使用解析
目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …...
每日十题八股-2024年11月27日
1.类型互转会出现什么问题吗? 2.为什么用bigDecimal 不用double ? 3.装箱和拆箱是什么? 4.Java为什么要有Integer? 5.Integer相比int有什么优点? 6.那为什么还要保留int类型? 7.说一下 integer的缓存 8.怎么…...

OpenCV截取指定图片区域
import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…...
Java部分新特性
模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...