Swift-内存管理

87 阅读1分钟

跟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()
    }
}