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;

最新文章

  1. freemarker内置函数和用法
  2. td 的colspan属性
  3. JAVA中怎么处理高并发的情况
  4. javascript获取对象中的属性及值
  5. html+css-----补
  6. iOS中nil、Nil、NULL、NSNull详解(转)
  7. 网站报错Access denied for user 'root'@'localhost' -问题排查续
  8. 初定为EGame
  9. JavaScript 中的内存和性能、模拟事件(读书笔记思维导图)
  10. c++模板两个数的加法
  11. 【转】控制台,终端,tty,shell等概念的区别
  12. linux查看日志文件内容命令tail、cat、tac、head、echo
  13. spring security oauth2 jwt 认证和资源分离的配置文件(java类配置版)
  14. scrapy爬虫学习系列一:scrapy爬虫环境的准备
  15. 设计模式系列之过滤器模式(Chriteria Pattern)
  16. 【Python 01】Python可以做什么
  17. html 转 PDF wkhtmltopdf image 不能显示的问题
  18. update layer tree导致页面卡顿
  19. nginx 负载 问题
  20. Oracle归档文件夹权限设置错误导致的数据库问题解决

热门文章

  1. Spring 梳理-MVC-配置DispatcherServet和ContextLoaderListener
  2. thymeleaf 语法
  3. 创建FTP访问的YUM源
  4. EJB生成代码后遇到transient错误
  5. jQuery鼠标滑过横向时间轴效果
  6. touch,stat
  7. java架构之路-(面试篇)JVM虚拟机面试大全
  8. 快学Scala 第十九课 (trait的abstract override使用)
  9. Asp.NetCore源码学习[2-1]:日志
  10. java中的String是不可变类