跟OC一样,Swift也是采用基于引用计算的ARC内存管理方案(针对堆空间)
Swift中ARC有3种引用:
1、强引用:默认情况下,引用都是强引用
2、弱引用(weak):通过weak定义弱引用
必须是可选类型的var,因为实例销毁后,ARC会自动将弱引用设置为nil ARC自动给弱引用设置nil时,不会触发属性观察器
3、无主引用(unowned):通过unowned定义无主引用
不会产生强引用,实例销毁后仍然存储着实例的内存地址(类似于OC中的unsafe_unretained) 试图销毁后访问无主引用,会产生运行时错误(野指针)
解决循环引用
weak、unowned 都能解决循环引用的问题,unowned 要比weak 少一些性能消耗
生命周期中可能被置为nil使用weak; 初始化赋值以后不会被置为nil使用unowned
- 闭包的循环引用
闭包表达式默认会对用到的外层对象 产生额外的强引用(对外层进行了retain操作)
例子:
class Person {
// 闭包属性
var fblock:(() -> ())?
func run() {
print("run")
}
deinit {
print("Person销毁")
}
}
func test() {
let p = Person()
p.fblock = {
p.run() // 造成循环引用
}
}
test()
解决:
func test() {
let p = Person()
p.fblock = {[weak p] in
p?.run()
}
}
func test() {
let p = Person()
p.fblock = {[unowned p] in
p.run()
}
}