Swift内存管理-示例讲解

news/2024/7/20 20:55:53 标签: swift, Swift教程, Swift视频, ios, iOS8
具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理。而对于值类型,如整型、浮点型、布尔型、字符串、元组、集合、枚举和结构体等,是由处理器自动管理的,程序员不需要管理它们的内存。
一、引用计数
每个Swift类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,称为引用计数(Reference Count,简称RC)。当对象被创建的时候,引用计数为1,每次对象被引用的时候会使其引用计数加1,如果不需要的时候,对象引用断开(赋值为nil),其引用计数减1。当对象的引用计数为0的时候,对象的内存才被释放。
下图是内存引用计数原理示意图。图中的房间就好比是对象的内存,一个人进入房间打开灯,就是创建一个对象,这时候对象的引用计数是1。有人进入房间,引用计数加1;有人离开房间,引用计数减1。最后一个人离开房间,引用计数为0,房间灯关闭,对象内存才被释放。

二、示例:Swift自动引用计数
下面我们通过一个示例了解一下Swift中的自动引用计数原理。下图是Employee类创建的对象的生命周期,该图描述了对象被赋值给3个变量,以及它们的释放过程。

示例代码如下:
class Employee {				①
var no : Int
var name : String
var job : String
var salary : Double


init(no : Int, name: String, job : String, salary : Double) {	②
    self.no = no
    self.name = name
self.job = job
self.salary = salary
println("员工\(name) 已经构造成功。")	③
    }
deinit {							④
println("员工\(name) 已经析构成功。")	⑤
    }    
}


var ref1: Employee?			⑥
var ref2: Employee?			⑦
var ref3: Employee?			⑧


ref1 = Employee(no: 7698, name: "Blake", job :"Salesman", salary : 1600)	⑨


ref2 = ref1						⑩
ref3 = ref1						⑪


ref1 = nil						⑫
ref2 = nil						⑬
ref3 = nil						⑭


上述代码第①行声明了Employee类,第②行代码是定义构造器,在构造器中初始化存储属性,并且在代码第③行输出构造成功信息。第④行代码是定义析构器,并在代码第⑤行输出析构成功信息。

代码第⑥~⑧行是声明3个Employee类型变量,这个时候还没有创建Employee对象分配内存空间。代码第⑨行是真正创建Employee对象分配内存空间,并把对象的引用分配给ref1变量,ref1与对象建立“强引用”关系,“强引用”关系能够保证对象在内存中不被释放,这时候它的引用计数是1。第⑩行代码ref2 = ref1是将对象的引用分配给ref2,ref2也与对象建立“强引用”关系,这时候它的引用计数是2。第⑪行代码ref3 = ref1是将对象的引用分配给ref3,ref3也与对象建立“强引用”关系,这时候它的引用计数是3。
然后在代码第⑫行通过ref1 = nil语句断开ref1对Employee对象的引用,这时候它的引用计数是2。以此类推,ref2 = nil时它的引用计数是1,ref3 = nil时它的引用计数是0,当引用计数为0的时候Employee对象被释放。
我们可以测试一下看看效果,如果设置断点单步调试,会发现代码运行完第⑨行后控制台输出:
员工Blake 已经构造成功。
析构器输出的内容直到运行完第⑭行代码才输出:
员工Blake 已经析构成功。

这说明只有在引用计数为0的情况下才调用析构器,释放对象。


更多内容请关注国内第一本Swift图书 《Swift开发指南》
本书交流讨论网站: http://www.51work6.com/swift.php
欢迎加入Swift技术讨论群:362298485

欢迎关注智捷iOS课堂微信公共平台



http://www.niftyadmin.cn/n/1036749.html

相关文章

1.java快速入门,idea开发工具的使用

java的概述 java于1995年由sun公司推出,2009年被oracle(甲骨文)收购 开发者:詹姆斯-高斯林 高级编程语言 特性:可移植性 Java技术体系 JavaSE 标准版:Java技术的核心与基础 …

CSDN产品 云IDE 来啦

云IDE产品介绍 云IDE使用教程 免费使用地址:点击【云IDE】,即可开始创建工作空间啦~ CSDN最新产品【云IDE】来啦!【云IDE】将为各位技术er一键秒级构建云开发环境,提升开发效率!为持续提升产品体验,现CSDN…

Swift使用闭包表达式

Swift中的闭包表达式很灵活,其标准语法格式如下:{ (参数列表) ->返回值类型 in 语句组}其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是后面有in关键字。Swift提供了多…

AtCoder Beginner Contest 259 E - LCM on Whiteboard

加注释版。 原文&#xff1a; AtCoder Beginner Contest 259 E - LCM on Whiteboard_浅度断墨的博客-CSDN博客 #include<stdio.h> #include<iostream> using namespace std; #include<string> #include<string.h> #include<algorithm> #includ…

Swift数字类型之间的转换

Swift数字类型之间的转换Swift是一种安全的语言&#xff0c;对于类型的检查非常严格&#xff0c;不同类型之间不能随便转换。一、整型之间的转换在C和Objective-C等其他语言中&#xff0c;整型之间有两种转换方法&#xff1a;从小范围数到大范围数转换是自动的&#xff1b;从大…

Uncaught Error: A <Route> is only ever to be used as the child of <Routes> element, never rendered d

react路由 22年发生了不小的变化 21年是这样写的 import ./App.css; import React from "react"; import Index from "./components/index"; import Alinput from "./components/alinput"; import { BrowserRouter as Router,Route } from &quo…

AtCoder Beginner Contest 259 D Circumferences

题目&#xff1a; 题目链接&#xff1a; D - Circumferences (atcoder.jp) 题目思路&#xff1a; 题目所求为能否从一个点 通过圆边到达另外一点 因为每个圆之间有交点存在连通的可能性 我们就只需要判断两个点 1.是否都在圆上 2.所在的圆是否连通 因为涉及到连通的问题…

Swift字典集合

字典表示一种非常复杂的集合&#xff0c;允许按照某个键来访问元素。字典是由两部分集合构成的&#xff0c;一个是键&#xff08;key&#xff09;集合&#xff0c;一个是值&#xff08;value&#xff09;集合。键集合是不能有重复元素的&#xff0c;而值集合是可以重复的&#…