Swift ARC Trans https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
swift使用ARC来跟踪和管理你的app 内存使用。在大多数情况下,这意味着内存管理在Swift中可以正常工作,你不需要考虑内存管理的问题。当实例不被需要时,ARC会自动释放它们占有的内存。
在少部分情况下,ARC需要更多你代码的信息来管理你的应用内存。
引用计数仅对class的实例有效,structures 和 enumerations 是value types 不是 reference types,不会被引用存储和传递
# How ARC Works ,ARC原理
每当你新建一个类实例,ARC分配一大块内存来存储实例相关信息。这块内存保存一些与实例有关的信息:实例的类型,与实例有关的存储属性的值。
另外,当一个实例不被需要时,ARC释放这部分内存。这保障了当类实例不被需要时不会占用内存。
如果ARC想要释放一个还在被使用的实例,访问这个实例的属性可能就行不通了。如果你想要访问这种实例,app可能会crash。
为了确保当实例仍然需要被使用时不会消失,ARC会跟踪一共有多少属性、常量、变量强引用这个实例。如果仍至少有一个主动指向这个实例,ARC就不会释放这个实例的内存。
为了保障上述的可行性,当你给属性、常量、变量赋一个类的实例时,属性、常量、变量会强引用这个实例。强引用意味着:只要有强引用指向一个实例,实例就不能被释放。
# ARC in Action
ARC举例:略https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
# SRC Strong Reference Cycles Between Class Instances, 实例间的强引用环
SRC:两个类的实例互相强引用就会形成保留环。
解决SRC:
## weak reference
弱引用不会阻止ARC清理被引用的实例。当仍有弱引用指向实例时,该实例仍然可能被ARC释放内存空间。当实例被释放时,ARC会把指向该实例的weak reference赋nil。 因为weak reference 指向的实例可能为nil,所以该实例永远只能是 var类型,也就是weak var optional(not weak let)。
❗️当ARC设置weak reference= nil 时,property observers 不会被调用。
对于使用垃圾回收的系统来说,弱引用指针有时候会被用来执行一个简单的缓存机制,因为只有当内存有压力时,系统才会清理weak reference。但是对于ARC来说,当实例的最后一个强引用被移除,就立刻被释放了,所以弱引用不再适用这样的目的。
JY自身小段总结:ARC原理:变量、常量、属性指向类实例时,默认是强引用,多一个就加一个。实例的最后一个强引用被移除时,实例占用的内存空间被释放,此时如果访问实例,app可能会crash。实例被释放后,ARC会将指向该实例的weak reference 置nil,不会设置unowned reference 为 nil。
## unowned references
unowned reference不强引用一个实例。当实例指向的另外一个实例 和该实例有相同的生命周期或者更长的生命周期时,可以使用unowned reference。
与weak reference不同的是,unowned reference 引用的实例预期总有一个值。结果就是用unowned reference标识的value并不会让他变成value?(optional value),ARC永远不会设置一个unowned 引用值为nil。
❗️只有在你确定unowned reference指向的另外一个实例A还没有被释放时,可以使用unowned reference。如果你试图访问已经被释放的这个实例A,那会得到一个runtime error。
ToBeContinue