swift ARC中的strong、weak、unowned
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的更多相关文章
- assign,copy,strong,weak,nonatomic的理解
举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段 ...
- assign,copy,strong,weak,nonatomic的具体理解
例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段内存 ...
- Objective-C中,ARC下的 strong和weak指针原理解释
Objective-C中,ARC下的 strong和weak指针原理解释 提示:本文中所说的"实例变量"即是"成员变量","局部变量"即是& ...
- property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...
- ARC指南1 - strong和weak指针
一.简介 ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因 ...
- 关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】
@property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的gette ...
- iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...
- ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)
ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了, ...
- iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL
以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the non ...
随机推荐
- 获取Android设备标识符
Android开发中有时候因业务需要客户端要产生一个唯一的标识符使服务器能识别某台Android设备,目前一般使用三种标识符分别为DeviceId.AndroidId.MAC地址. 获取DeviceI ...
- 【PCIE-1】---Pcie基本概念普及(扫盲篇--巨适合新手)
PCIE由早期得PCI扩展衍生而来并且对兼容PCI,两者得主要区别在于并行到串行得切换,且速率更快.目前主板上越来越多得设备都挂载到PCI总线下面,甚至部分硬盘也会挂载PCI总线下面,可见PCIE得应 ...
- 浅析java垃圾回收机制
什么是java程序中的垃圾?什么这些垃圾又是怎样被回收的?为什么会被回收?不进行回收又会怎样?这些问题都是我们要在这篇博客中要解决的问题! 大家都知道,在c语言中,作为程序员,必须得考虑到去怎样回收已 ...
- 关于.NET HttpClient方式获取微信小程序码(二维码)
随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来.近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数):看了下小程序官方文档文档,结合网上的例子,未看到 ...
- .NET成人礼 | 还记得20年前一起拖过的控件吗?
本文是MVP Ediwang写的回忆一个80后的拖控件的感悟,与君共勉: 每一代人都有记忆里的味道.煤球炉.黑白电视机是属于父母的记忆.而“拖控件”式编程,启蒙了无数像我这样的80后(嗯,89也算80 ...
- Asp.net内置对象用途说明
Asp.net 内置对象 1.Session当客户第一次请求网页,session创建.当客户最后一次请求页面,一段时间后,session销毁.默认30分钟. 一般存用户信息,即登陆成功后,在sessi ...
- 阿里云 RDS 数据库又发 CPU 近 100% 的“芯脏病”
最近云界发生了2件事,一件是大事,一件是小事,大事是阿里云与微软合作推出了开放应用模型 Open Application Model(OAM),小事是由于微软 SQL Server 在阿里云上水土不服 ...
- Vue部分编译不生效,解决Vue渲染时候会闪一下
0828自我总结 Vue部分编译不生效,解决Vue渲染时候会闪一下 一.Vue编译不生效 在标签里添加v-pre <script src="vue.js"></s ...
- unittest中的方法调用时报错ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest
调用unittest中的方法时报错: ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest ...
- docker配置阿里云镜像
今天docker pull镜像的时候太慢了 所以这里配置下阿里云镜像 打开阿里云控制台,没有的可以用淘宝账号或者支付宝账号直接登录 打开容器镜像服务,镜像加速器,复制加速器地址 修改配置文件 $: ...