swift 学习之自动引用计数
swift 学习之自动引用计数
- 学习和研究的主要是“实例对象和实例对象直接的相会强引用所产生的内从泄漏”和“使用闭包产生的强引用造成的内存泄漏”
注意:只有以引用类型存储或者传递的才会存在自动引用计数,比如类,闭包,而枚举、结构体等这都是值存储,值传递不存在引用计数问题(其实也就是Object-c中我们熟悉的ARC,和他的原理是一样的)
- 实例对象和实例对象之间的相互引用造成的内存泄漏
1>产生原因
两个类中都有对方类的实例变量作为自己的属性,举个例子:创建一个Person类和一个Clazz类
Class Person {
var clazz:Clazz?
}
Class Clazz {
var person:Person?
}
// 创建两个对象,并且赋值给对方就会造成循环引用
let jason = Person()
let class1_1 = Clazz()
jason.clazz = class1_1
class1_1.person = jason
上面的例子,就是一个循环引用的例子,jason->Person<->class1_1->Clazz .
2> 那么该怎么解决这个问题呢
在Objective-C中我们知道解决这种类与类之间的强引用,就是声明属性的时候一个用强引用一个用弱引用,那么在swift中是如何解决这种问题的呢?
swift 提供了两种方式:弱引用(weak修饰)和无主引用(unowned修饰)
使用法则:弱引用在生命周期内有可能变成nil使用,一旦申明就不会变成nil用无主引用 。
事实上规则还是和objective-C的规则一样,遇到这种情况也是一个用强引用一个用弱引用或者无主引用。
注意:存在一种特殊的情况,那就是这两个类各自持有的对方实例对象都必须有值,那么这种情况就需要一个用无主引用,一个用隐式展开可选属性
- 闭包循环引用造成的内存泄漏
1>造成原因:这是一种闭包和类之间的引用造成的。具体原因就是:一个类将闭包作为自己的属性,然后在类中给闭包赋值,在闭包中又引用了自身,造成循环引用,内存泄漏
2>解决问题的办法
在objective-C中我们解决的办法就是重新声明类实例为__weak/__block,两个修饰词的区别是__weak只能修饰对象,而__block可以修饰对象和普通变量(需要在block里修改的变量)
而在swift中出现了一个新的概念:占有列表,在swift就是通过定义占有列表来解决闭包的循环引用的
占有列表:占有列表中的每个元素都是由weak或者unowned关键字和实例的引用组成的。
那么什么时候用weak:当占有的引用有时可能为nil的时候
unwoned:当占有的引用和闭包总是会同时销毁时
swift 学习之自动引用计数的更多相关文章
- swift 学习- 18 -- 自动引用计数
// Swift 使用 自动引用计数 (ARC) 机制来跟踪和管理你的应用程序的内存, 通常情况下, Swift 内存管理机制会一直起作用, 你无须自己来考虑内存的管理, ARC 会在类的实例不再被使 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift学习笔记之-自动引用计数
//自动引用计数 import UIKit /*自动引用计数(Automatic Reference Counting) 防止循环强引用 Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用 ...
- swift:自动引用计数ARC
Swift自动引用计数:ARC 原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...
- Swift基础语法-内存管理, 自动引用计数
1. 工作机制 Swift和OC一样,采用自动引用计数来管理内存 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1 当该强引用消失时,引用计数会自动-1 当引用计数为0时,该对象会被销毁 2 ...
- swift详解之九---------------自动引用计数、循环引用
自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...
- Swift 自动引用计数(ARC)
Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...
- Swift ARC 自动引用计数
1.ARC 引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0 ...
- Swift5 语言指南(二十五) 自动引用计数(ARC)
Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...
随机推荐
- Java基础知识(一)
类与对象 1.对象:客观存在的一切事物称之为对象 类:具有相同属性和方法的对象的集合 2.类:属性,方法 3.修饰符: public protected 默认(不写) private 任何地方 ...
- 解读TCP 四种定时器
TCP 是提供可靠的传输层,它使用的方法之一就是确认从另一端收到的数据.但是数据和确认都可能会丢失.TCP 通过在发送时设置一个定时器来解决这个问题.如果当定时器溢出时还没收到确认,它就会重传该数据. ...
- 基础知识全面LINUX
学习Linux系统的重要性应该不用多说,下面我就对Linux的基础知识进行一个全面而又简单的总结.不过建议大家还是装个Linux系统多练习,平时最好只在Linux环境下编程,这样会大有提高. linu ...
- bash启动加载过程
- ABP官方文档翻译 4.2 数据传输对象
数据传输对象 DTOs的必要性 领域层的抽象 数据隐藏 序列化和懒加载问题 DTO转换和验证 示例 DTOs和实体间的自动映射 辅助接口和类 数据传输对象用来在应用层和展示层之间传输数据. 展示层调用 ...
- 2.Ray-消息发布器与消息存储器
消息发布器: Ray是基于Event Sourcing设计的ES/Actor框架,ESGrain状态(State)的修改.ESGrain之间的通信默认使用RabbitMQ通信.消息的发布器主要是Rab ...
- python中的各种转化
1.数之间的转化 #浮点型to整型 >>> int(5.6) 5 #整型to浮点型 >>> float(5) 5.0 2.数与字符串 #字符串to整型 >&g ...
- xBIM 插入复制功能
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- BZOJ 4537: [Hnoi2016]最小公倍数 [偏序关系 分块]
4537: [Hnoi2016]最小公倍数 题意:一张边权无向图,多组询问u和v之间有没有一条a最大为a',b最大为b'的路径(不一定是简单路径) 首先想到暴力做法,题目要求就是判断u和v连通,并查集 ...
- BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]
1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...