Swift基础语法-内存管理, 自动引用计数
1. 工作机制
- Swift和OC一样,采用自动引用计数来管理内存
- 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1
- 当该强引用消失时,引用计数会自动-1
- 当引用计数为0时,该对象会被销毁
2. 循环引用
- 在通常情况下,ARC是会自动帮助我们管理内存的
- 但是在开发中我们经常会出现循环引用的问题,比如下面的示例
- Student对Book对象有一个强引用
- 而Book对Student有一个强引用
- 在两个对象都指向nil时,依然不会被销毁,就形成了循环引用
// 1.创建类
class Student {
var book : Book? // 对象属性用可选类型
deinit {
print("Student -- deinit")
}
}
class Book {
var owner : Student?
deinit {
print("Book -- deinit")
}
}
// 2.创建对象
var stu : Student? = Student()
var book : Book? = Book()
// 3.相互引用
stu?.book = book
book?.owner = stu
// 4.对象置nil
stu = nil
book = nil
- 解决方案
- swift提供了两种解决方案
weak: 和OC中的__weak一样是一个弱引用.当指向的对象销毁时,会自动将指针指向nilunowned: 和OC中的__unsafe_unretained.当对象销毁时依然指向原来的内存地址(注意:非常危险,很容易产生野指针错误/访问了僵尸对象)unowned:__unsafe_unretained,该修饰不能指向nil
- swift提供了两种解决方案
// 1.定义两个类
class Student {
var book : Book?
deinit {
print("Student --- deinit")
}
}
/*
weak : __weak
unowned : __unsafe_unretained,该修饰不能指向nil
*/
class Book {
// weak var owner : Student?
// unowned : __unsafe_unretained,该修饰不能指向nil,
// 因此这里必须先初始化, 也就要先创建一个对象, 因此输出结果会多销毁一个 student 对象
// owner 是弱引用, 因此在 book 创建完成时就马上被销毁
unowned var owner : Student = Student()
deinit {
print("Book --- deinit")
}
}
// 2.创建两个对象
var stu : Student? = Student()
var book : Book? = Book()
// Book 中的 owner 属性, 在 book 创建完成时, 就马上被销毁,
// 但是如果 unowned 修饰, 释放后再次访问时, 访问的就是僵尸对象, 野指针错误
// 如果是 weak 修饰, 释放后再次访问时, 访问的是 nil , 不会报错
// 3.让两个对象之间产生关系
stu!.book = book
book!.owner = stu!
// 4.让对象销毁
book = nil
stu = nil
// 使用 weak 修饰输出结果
// Student --- deinit
// Book --- deinit
// 使用 unowned 修饰输出结果
// Student --- deinit // 这个打印是 book 创建时马上销毁的弱引用对象
// Student --- deinit
// Book --- deinit
Swift基础语法-内存管理, 自动引用计数的更多相关文章
- iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)
学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...
- swift详解之九---------------自动引用计数、循环引用
自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...
- Objective-C内存管理之-引用计数
本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 内存管理 1 内存管理的基本概念 1.1 Objective-C中的 ...
- Python内存管理及引用计数
作为一门动态语言,python很重要的一个概念就是动态类型,即对象的类型和内存占用都是运行时确定的.(Why?)运行时,解释器会根据语法和右操作数来决定新对象的类型.动态类型的实现,是通过引用和对象的 ...
- 2-Python基础语法-内存管理-运算符-程序控制
目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...
- Objective-C内存管理之引用计数
初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...
- iOS项目转移到自动引用计数
这里主要参考了Apple官方文档:Transitioning to ARC Release Notes 在支持iOS5的Xcode4中,创建项目会看到这样的选项: 这是iOS5的新特性,自动对象引用计 ...
- OC基础15:内存管理和自动引用计数
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- java jvm学习笔记一
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式 ...
- yahoo 交易数据
yahoo提供国内和国外股市每天的交易数据资料,这可谓一大幸事啊.http://table.finance.yahoo.com/table.csv?s=ibm&d=6&e=22& ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问
上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step 二 图片验证码的识别” ...
- Zabbix探索:网络设备监控1
近期需要大量添加网络设备,为了避免以后在节点100上出现问题,所以特地申请了一台虚拟机,用作代理110. 虽然Zabbix模板中的英文很简单,但是为了同事着想,还是将大部分内容汉化了,避免今后说理解不 ...
- activemq 的小实验
package ch02.chat; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms ...
- Nginx负载均衡SFTP
1.CentOS安装SFTP,参考 2.Nginx-1.8.1 下载 ,Nginx_TCP插件 下载 3.安装Nginx [root@localhost nginx-1.8.1]# yum -y in ...
- bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...
- codeforce--600D - Area of Two Circles' Intersection
题意:求相交圆的面积.借鉴大神代码,精度超高. #include <fstream> #include <iostream> #include <string> # ...
- Java学习笔记(1)
封装基本原则之一: 将实例变量标记为private,将getters与setters标记为public,用setters来检查参数并判断是否可以执行: 局部变量与实例变量的区别: 你无需初始实例变量, ...
- EXCEL 操作
1.为几万行数据加序号 先在A1,A2分别输入1,2,选中A1:A2,双击A2右下角那个小方块. 数据有多少行就会自动填充多少行(要求:B列数据连续) 2.统计一列中单元格的值等于某个值的单元格的个数 ...