自动引用计数
分为:
自动引用计数概念
引用计数策略
如何解决循环引用
闭包的循环引用
使用的到的关键字
weak 弱引用 不会影响引用计数,一般时 optional
unowned 无主引用 不会影响引用计数,一般时 非optional
概念:
在swift中 自动引用计数是实例的被引用次数保存起来,当被引用次数变为零的时候,就将其释放的过程。
自动引用计数可以实现自动资源管理的目的
引用计数策略:
1、强引用 (strong reference) ,引用时会导致引用计数 +1 ,失去引用时会使引用计数 -1
2、弱引用 (weak reference) 不会影响引用计数,一般时 optional
3、无主引用 (unowend reference) 不会影响引用计数,一般时 非optional
example:
class Dog {
var name:String
//构造器 初始化
init(name:String){
self.name = name
print("dog \(name) is init")
}
//析构器 释放
deinit{
print("dog \(name) is denint")
}
}
引用计数
var dog1 : Dog?
var dog2 : Dog?
var dog3 : Dog?
dog1 = Dog(name:"淘气") //引用计数为1
dog2 = dog1 //引用计数为2
dog3 = dog1 //引用计数为3
输出
dog 淘气 is init 现在dog 的引用计数为3
取消引用计数
dog1 = nil //引用计数为2
dog2 = nil //引用计数为1
print("ready nil dog3")
dog3 = nil //引用计数为0 调用了析构器
输出
dog 淘气 is init
ready nil dog3
dog 淘气 is denint
表示 dog1,dog2 = nil 后 ,dog3 = nil ,实例才被释放。
解决循环应用
自动引用计数会跟踪我们所创建的一个实例的引用数量,当引用计数为0的时候销毁它,
但是有一种情况使引用计数永远不能为0 ----------> 循环的强引用
循环的强引用:
两个实例相互持有对方的强引用,每个实例都会让对方一直存在。因为这2个实例永远不会释放,占有的资源永远不会释放掉,就导致了 — 内存泄露
解决循环引用的方法:
1、使用弱引用 关键字 weak 在引用对方类的时候 在 前面 加weak
2、使用无主引用 关键字 unowend 使用无主引用 注意,类型不能是optional,一定要赋值
example:
class DogName {
var name:String
//持有另一个类
var dogHouse : DogHouse?
init(name:String){
self.name = name
print("dogName \(name) is init")
}
deinit{
print("dogName \(name) is deinit")
}
}