Swift ARC 自动引用计数
1、ARC
引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0,此时系统会自动释放实例所占用的内存空间,一旦释放就不能再访问这个实例的属性和方法。由于该过程是自动的,不需要开发人员来开辟和释放内存,因此称为自动引用计数,简称 ARC(Automatic Reference Counting)。
- 为了避免使用中的实例被释放,ARC 会跟踪并计算每一个实例被多少属性、常量和变量所引用。
- 引用有强引用和弱引用之分,这是为了保证在某些循环引用的情况下可以打破循环。
- 为了保证实例在被属性、常量和变量引用时不会被意外释放,引用默认情况下会被设定为强引用。
1.1 ARC 示例
在构造器和析构器中分别写一个打印语句,用来标示实例的创建和销毁。
class Student { var name: String
var age: Int init(name: String, age: Int) {
self.name = name
self.age = age print("创建了一个实例")
} deinit { print("销毁了一个实例")
}
}
声明两个变量,把它们的类型声明为
Student
的可选型,现在它们还没有被赋值。var xiaoming: Student?
var xiaogang: Student?
通过构造器创建一个
Student
的实例,然后把这个实例赋值给第一个变量。xiaoming = Student(name: "xiaoming", age: 12)
此时运行程序输出如下。
创建了一个实例
这次让第二个变量也引用这个实例,现在这个实例的引用计数为 2,代表着
Student
实例的内存地址被引用了两次。xiaogang = xiaoming
下面通过给变量赋值
nil
来断开引用,首先断开一个变量的引用,现在Student
实例的引用计数已变为 1。xiaogang = nil
接着断开第二个变量的引用,现在没有任何属性或者变量引用这个实例了。
xiaoming = nil
可以看到中控台打印信息如下,这个类调用了析构器,代表它被销毁了,释放出了实例所占用的内存空间。
销毁了一个实例
看起来只是引用的数量增减那么简单,不过在真实的内存中,ARC 在检验某个对象的计数时不可避免的需要对堆内存进行加锁和解锁处理,也就是说无论你如何在代码层面优化代码,ARC 本身仍会带来一部分性能的损耗,这也解释了为什么值类型是更好的选择。
Swift ARC 自动引用计数的更多相关文章
- swift:自动引用计数ARC
Swift自动引用计数:ARC 原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...
- obj-c编程11:内存管理和ARC(自动引用计数)
乖乖隆地洞,这篇文章内容可是不得了,内存管理哦!首先,这个要是搞不明白,你就等着进程莫名其妙的挂死,或是疯狂申请内存却不释放,结果被OS杀死,不管是"自杀"还是"他杀&q ...
- ARC————自动引用计数
一.内存管理/引用计数 1.引用计数式内存管理的方式(下面四种) 对象操作 OC方法 生成并持有对象 alloc/new/copy/mutableCopyd等方法 持有对象 retain方法 释放对象 ...
- Swift 自动引用计数(ARC)
Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...
- swift学习笔记之-自动引用计数
//自动引用计数 import UIKit /*自动引用计数(Automatic Reference Counting) 防止循环强引用 Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用 ...
- swift 学习- 18 -- 自动引用计数
// Swift 使用 自动引用计数 (ARC) 机制来跟踪和管理你的应用程序的内存, 通常情况下, Swift 内存管理机制会一直起作用, 你无须自己来考虑内存的管理, ARC 会在类的实例不再被使 ...
- Swift5 语言指南(二十五) 自动引用计数(ARC)
Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...
- Swift2.1 语法指南——自动引用计数
原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...
- Welcome-to-Swift-16自动引用计数(Automatic Reference Counting)
Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时, ...
随机推荐
- rsync增量备份脚本
shell脚本: #!/bin/bash export PATH=/usr/local/bin:/usr/bin:/bin dir=/mnt/ DAY=`date "+%Y-%m-%d&qu ...
- 51Nod 算法马拉松28 A题 先序遍历与后序遍历 分治
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - 51Nod1832 题意概括 对于给定的一个二叉树的先序遍历和后序遍历,输出有多少种满足条件的二叉树. 两棵二 ...
- 002 在大数据中基础的llinux基本命令
一:基本命令 1.显示当前的目录 2.长格式显示目录自身的信息 3.创建文件 4.创建目录 创建多层目录,使用-p. 5.删除目录或者文件 -f:不提示,强制删除 -i:删除前,提示 -r:删除目录以 ...
- NPM 上传自己的包
NPM 上传自己的包 项目中经常 npm install,npm init啥的,那么如何上传自己的包到npm上呢. 注册账号 NPM官网 本地弄一个包 创建npm_test 文件夹 注:不能够有一些特 ...
- Python3练习题系列(04)
题目: 制作一个游戏 知识点: 函数.if_elif_else, while, exit 游戏图谱: 游戏代码: from sys import exit def gold_room(): print ...
- Python3练习题系列(03)
题目: 思考While循环,看看它的特点是什么? 知识点: while循环 分析: 特点:while-loop(while 循环).while-loop 会一直执行它下面的代码片段,直到它对应的布尔表 ...
- [USACO09JAN]Total Flow
OJ题号: BZOJ3996.洛谷2936.SPOJ-MTOTALF.SCU3353 思路: 题目的要求是将所有边合并成一条边,求合并后的流量. 实际上相当于直接求最大流. EdmondsKarp模板 ...
- Ubuntu Siege 压力测试工具
安装 $ sudo apt install siege Siege命令常用参数 -c 200 指定并发数200 -r 5 指定测试的次数5 -f urls.txt 制定url的文件 -i intern ...
- C++ 多继承与虚基类
转载来自:CSDN insistGoGo (http://blog.csdn.net/insistgogo) 多继承的定义:派生类的基类大于一个 语法: class 派生类名:继承方式1 基类名1 ...
- 给你的网站添加 console.js
本文仅先给使用console调试的FE同学,如果你还不知道console是什么,或者还停留在alert阶段,那就不要浪费时间了,say bay bay! 你是否试程序的过程中用过console.log ...