Swift 用自动引用计数ARC(Automatic Reference Counting)方式来跟踪和管理app的内存使用。这使得内存管理成为swift内部的机制,不需要认为考虑。ARC会自动释放那些不再被需要的变量。

ARC如何工作

每次创建一个类的新实例时,ARC会分配一大块内存来存储有关该实例的信息。该内存将保存有关实例类型的信息,以及与该实例关联的任何存储属性的值。

另外,当不再需要实例时,ARC会释放该实例使用的内存,以便将内存用于其他目的。这样可以确保类实例在不再需要时不占用内存空间。

但是,如果ARC要释放仍在使用的实例,那么将无法再访问该实例的属性,或者调用该实例的方法。实际上,如果您尝试访问该实例,那么您的应用程序很可能会崩溃。

为了确保实例在仍然需要时不会消失,ARC跟踪当前引用每个类实例的属性,常量和变量。只要至少对该实例的一个活动引用仍然存在,ARC将不会释放实例。

为了实现这一点,只要将类实例分配给属性,常量或变量,该属性,常量或变量就可以强制引用该实例。这个引用被称为“强”引用,因为它保持了对该实例的坚定的约束,并且不允许它被解除分配,只要这种强烈的参考依然存在。

1、strong(强引用): 声明一个属性时,default默认为strong。

当变量设置为nil时,不会调用deinitializer函数。强大的参考循环可以防止该实例被释放,造成应用程序中的内存泄漏。

var defaultValue: Int = 7
//默认defaultValut为强引用类型

2、weak(弱引用):

弱引用是对所引用的实例不会保持强制的引用,因此不会阻止ARC处理引用的实例。可以通过将weak关键字放在属性或变量声明之前来指示弱引用。

因为一个弱引用并没有对它引用的实例保持强烈的控制,所以这个实例可能被解除分配,而弱引用仍然是指它。因此,当引用的实例被释放时,ARC会自动将弱引用设置为nil。而且,由于弱引用需要在运行时将其值更改为nil,所以它们总是被声明为可选类型(Optional)的变量而不是常量。

class Apartment {
let unit: String
init(unit: String) {
self.unit = unit
}
weak var tenant: Person?
//将tenant设为nil的时候,tenant将会被释放。
deinit { print("Apartment \(unit) is being deinitialized") }
}

3、unowned(未知引用):

一个未知的参考预计总是有一个价值。因此,ARC从未将未知引用的值设置为nil,这意味着使用非选择类型定义未知引用。

仅当您确定引用始终是指向未释放的实例时,才使用未知引用。如果您尝试在该实例被释放后访问unowned的值,那么您将收到运行时错误。

举个例子,客户与信用卡之间的关系,客户可能有也可能没有信用卡,但信用卡将始终与客户相关联。 CreditCard实例永远不会超过它所指的客户。为了表示这一点,客户(Customer)类有一个optional卡属性,但CreditCard类有一个unowned客户属性。

由于信用卡将始终拥有客户,因此将其客户资产定义为unowned引用,以避免强引用!

Overall:

简单理解就是

strong为nil也不会被释放;

weak为nil会被释放;

unowned不能为nil;

swift ARC中的strong、weak、unowned的更多相关文章

  1. assign,copy,strong,weak,nonatomic的理解

    举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段 ...

  2. assign,copy,strong,weak,nonatomic的具体理解

    例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段内存 ...

  3. Objective-C中,ARC下的 strong和weak指针原理解释

    Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是& ...

  4. property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

    iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...

  5. ARC指南1 - strong和weak指针

      一.简介 ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因 ...

  6. 关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】

    @property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的gette ...

  7. iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

    iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...

  8. ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)

    ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了, ...

  9. iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL

    以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the non ...

随机推荐

  1. SpringBoot 定时任务实现方式

    定时任务实现的几种方式: Timer:是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但 ...

  2. 非对称加密openssl协议在php7实践

    据网上资料,RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商务中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(RON RIVEST).阿迪·萨莫尔(ADI SHAMIR)和伦纳德· ...

  3. yzoj P2371 爬山 题解

    背景 其实 Kano 曾经到过由乃⼭,当然这名字⼀看⼭主就是 Yuno 嘛.当年 Kano 看见了由乃⼭,内⼼突然涌出了⼀股杜甫会当凌绝顶,⼀览众⼭⼩的 豪⽓,于是毅然决定登⼭.但是 Kano 总是习 ...

  4. 学习WEBAPI(DOM)第二天

    目录 第二天学习目标: 一.阻止超链接的默认跳转行为 二.鼠标进入事件和鼠标离开事件 三.根据name属性值获取元素==>表单标签,返回的是伪数组 四.根据类样式的名字来获取元素,返回的是伪数组 ...

  5. 值类型不允许赋值为Null

    与引用类型不同,值类型不可能包含 null 值. 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值.有关值类型默认值的信息,请参见默认值表. bool false byte 0 char ' ...

  6. .Net Core AA.FrameWork应用框架介绍

    开发多年,一直在从社区获取开源的便利,也深感社区力量的重要性,今天开源一个应用基础框架AA.FrameWork,也算是回馈社区,做出一点点贡献,希望能够帮助类似当年入行的我. AA.FrameWork ...

  7. Hexo 博客快速整合gitalk组件,给静态博客添加动态评论功能!

    什么是 hexo-plugin-gitalk

  8. .net core运用application/x-www-form-urlencoded发起post请求

    通常情况下都是使用 application/json发起post请求,但是有的.net 接口只接收 application/x-www-form-urlencoded 例如: { name:" ...

  9. 微信小程序学习总结

    微信小程序开发环境安装以及相关设置配置 微信小程序前端页面书写 微信小程序前端样式WXSS书写 微信小程序中事件 微信小程序自定义组件 微信小程序发起请求 微信小程序登入流程 微信小程序路由跳转 微信 ...

  10. Ubuntu php安装xdebug

    1.安装xdebug扩展: sudo apt-get install php-xdebug 2.找到扩展的路径: 3.编辑php.ini文件,末尾加入,保存退出: [xdebug] zend_exte ...