自动引用计数(Automatic Reference Counting)简称ARC,是Swift对应用程序内存的跟踪和管理。跟Java里面的Gc类似,但是又不太一样。
ARC是实例的引用数为0,ARC就会销毁这个实例。
GC是当程序不能访问这个实例,称为该实例”不可达的”,GC就会负责回收这些”不可达的”的实例,回收算法很复杂,Java规范对GC的很多行为都没有进行严格的规定,不同的厂商在各自实现的Jvm上都有不同的实现。
ARC需要开发者保证实例不再被任何属性、常量、变量所引用,ARC就会自动释放其占用的内存。
一般情况下没有什么问题,但是强循环引用需要我们去打破这个强关联,以避免内存泄漏,这分为四种情况,我做下简要的说明:
- 有Apartment公寓和Person居民两个类,Apartment有一个类型为Person的可选变量,Person有一个类型为Apartment的可选变量,这两个变量相互强引用,导致内存泄漏,Apartment实例的Person变量可以为nil,因为公寓里面可以没有人居住,这个时候我们可以将Apartment的Person变量设置为弱引用,在前面加上weak关键字,这样就打破了强循环引用,ARC就可以释放这两个实例的内存了
- Customer和CreditCard,模拟了银行客户和客户的信用卡。这两个类中,每一个都将另外一个类的实例作为自身的属性。这种关系可能会造成循环强引用。一个客户可能有或者没有信用卡,但是一张信用卡总是关联着一个客户,这个时候我们可以将信用卡的客户属性设置为无主引用,在前面加上unowned关键字,同样打破了强循环引用,可以被ARC释放内存了。
- Country和City,模拟国家和城市,在这个模型中,每个国家必须有首都,每个城市必须属于一个国家。这使两个属性在初始化完成后能被直接访问(不需要可选展开),同时避免了循环引用。为了满足这种需求,通过在类型结尾处加上感叹号(City!)的方式,将Country的capitalCity属性声明为隐式解析可选类型的属性。这意味着像其他可选类型一样,capitalCity属性的默认值为nil,但是不需要展开它的值就能访问它。City的country属性设置为无主引用,同样打破强循环引用。
- 闭包引起的循环强引用,在定义闭包时同时定义捕获列表作为闭包的一部分,通过这种方式可以解决闭包和类实例之间的循环强引用。
详情请参考
http://wiki.jikexueyuan.com/project/swift/chapter2/16_Automatic_Reference_Counting.html
我也是参考上面总结的,疏通自己的知识流程,便于理解。