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会自动释放类实 ...
随机推荐
- AWS认证权威考经(助理级认证篇)
笔者作为AWS官方认证的早期通过者,已经拿到了AWS的助理级解决方案架构师.开发者认证,系统管理员认证.这几年也陆续指导公司多人通过AWS的认证.本篇文章将分享如何通过自学的方式轻松通过AWS的助理级 ...
- IO (五)
1 序列化和反序列化 1.1 ObjectOutputStream 序列化 1.1.1 概述 ObjectOutputStream将Java对象的基本数据写入OutputStream,可以使用Obje ...
- C语言预处理 编译 汇编 链接四个阶段
c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接. 编译过程 编译过程又可以分成两个阶段:编译和会汇编. 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高 ...
- gulp最简示例
全局安装 $ npm gulp -g 作为项目的开发依赖安装 $ npm gulp --save-dev 脚本文件 在根目录创建gulpfile.js文件 const gulp = require(' ...
- ServiceStack.OrmLite T4模板使用记录
前言 最近研究了下ServiceStack.OrmLite,文档中也提到了使用T4模板对数据库中已经有了表进行实体的映射,这里也顺便记录下使用的步骤和情况. 开始使用 引用T4模板 首先我们创建一个工 ...
- Sonar 常用代码规则整理(一)
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分 ...
- Java对正则表达式的支持(一)
Java对正则表达式的支持主要体现在String.Pattern.Matcher和Scanner类. 1.Pattern.Matcher 先看一个Pattern和Matcher类使用正则表达式的例子. ...
- HDU 4333 Revolving Digits
扩展KMP的应用 我们发现本题的关键在于如何高效的判断两个同构字符串的大小关系,想到如果能够预处理出每一个同构字符串与原字符串的最长公共前缀,那么直接比较它们不一样的部分就好,扩展KMP正好是用来处理 ...
- 洛谷 [P2661] 信息传递
求有向图的权值为一的最小环 并查集做法 维护一个dis[],表示i号元素到fa[i]的距离. 对于输入的每两个点u,v,询问这两个点的fa[]是否相同,如果相同就成环,维护最小值,mi=min(mi, ...
- vue端口号被占用如何解决
vue端口占用问题 1. vue init webpack-simple#1.0 vue-webpack-simple-demo 2. cd vue-webpack-simple-demo 3. cn ...