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学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- 018如何建立自动化框架 how to bulid the framwork
本讲包括: 一. objective 二. How to bulid 三. Keyview of frawork (关键视图) 四. conclusion automation framwork:自动 ...
- 自动化测试(二):QTP验证点
1 程序自带验证点 自带验证点:图形界面insert -> checkpoint Standard Checkpoint 标准验证:用于检查测试对象的属性 Text Checkpoint 文 ...
- opencv2.4.4 背景减除算法收集
算法集合:https://code.google.com/p/bgslibrary/ 测试:AdaptiveBackgroundLearning算法 #include <iostream> ...
- 浅析ado.net获取数据库元数据信息 DeriveParameters
写这个文章源于早先对ADO.Net获取数据库元数据上的认识,去年我在阅读ADO.Net Core Reference的时候曾经注意过DataSet的FillSchema的这个方法.这方面,在我之前的随 ...
- NOIP2011 计算系数
1计算系数 给定一个多项式 (ax + by)k ,请求出多项式展开后 x n y m 项的系数. [输入] 输入文件名为 factor.in. 共一行,包含 5 个整数,分别为 a,b,k,n,m, ...
- matlab 函数说明—conv2
conv 是卷积的意思,2表示2维卷积. conv2的调用形式如下: 1. C = conv2(A,B) 这是最简单的一种调用形式,B作为卷积核在A的范围内滑动,若[ma na] =size(A) ...
- ubuntu免验证登陆权限问题
由于经常ssh到服务器,每次输入密码很烦.就传了本机公钥到服务器. 和所有教程将的一样,做起来挺简单的. 本机ssh-keygen -t rsa生成公钥和密钥. 将公钥传至服务器,用户目录下.ssh/ ...
- 第十一章、认识与学习 BASH 数据流重导向
数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给它导向到其他的地方,例如文件或者是装置 (例如打印机之类的)! 什么是数据流重导向 命令运行过程如下: 图 5.1.1.命令运行过程的数据 ...
- 关于PCB布线的顺序到底是怎样才合理?
有人说先布好电源线和地线,让它们尽量靠近走,然后再考虑信号线:也有人说先布好关键的信号线,然后再走电源和地线:还有人说先布好电源线,再布信号线,地线最后布.到底怎么样才算好呢?或者说,一般应按照什么顺 ...
- nyoj 17 单调递增最长子序列
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入 ...