zoukankan      html  css  js  c++  java
  • swift内存管理(30- Swift内存管理)

    Swift内存管理:
    管理引用类型的内存, 不会管理值类型, 值类型不需要管理
    内存管理原则: 当没有任何强引用指向对象, 系统会自动销毁对象
    (默认情况下所有的引用都是强引用)
    如果做到该原则: ARC
     
    class Person {
        var name:String
        init(name:String){
            self.name = name
        }
        deinit{
            print("deinit")
        }
    }
    var p:Person? = Person(name: "qbs")
    p = nil
    输出结果: deinit
     
    weak弱引用
    class Person {
        var name:String
        init(name:String){
            self.name = name
        }
        deinit{
            print("deinit")
        }
    }
    强引用, 引用计数+1
    var strongP = Person(name: "qbs")  1
    var strongP2 = strongP  2
     
    弱引用, 引用计数不变
    如果利用weak修饰变量, 当对象释放后会自动将变量设置为nil
    所以利用weak修饰的变量必定是一个可选类型, 因为只有可选类型才能设置为nil
    weak var weakP:Person? = Person(name: "qbs")
    if let p = weakP{
        print(p)
    }else
    {
        print(weakP)
    }
    输出结果:
    deinit
    nil
    unowned无主引用 , 相当于OC unsafe_unretained
    unowned和weak的区别:
    1.利用unowned修饰的变量, 对象释放后不会设置为nil. 不安全
      利用weak修饰的变量, 对象释放后会设置为nil
    2.利用unowned修饰的变量, 不是可选类型
      利用weak修饰的变量, 是可选类型
     
    class Person {
        var name:String
        init(name:String){
            self.name = name
        }
        deinit{
            print("deinit")
        }
    }
    unowned var weakP:Person = Person(name: "qbs")
     
    循环引用
    ARC不是万能的, 它可以很好的解决内存问题, 但是在某些场合不能很好的解决内存泄露问题
    例如两个或多个对象之间的循环引用问题
    class Person {
        let name:String  姓名
        人不一定有公寓
            如果这里不加weak的话,当对象设置为nil时,该对象并没有被销毁.
        weak var apartment: Apartment? 公寓
        init(name:String){
            self.name = name
        }
        deinit{
            print("(self.name) deinit")
        }
    }
    class Apartment {
        let number: Int  房间号
        var tenant: Person? 租客
        init(number:Int){
            self.number = number
        }
        deinit{
            print("(self.number) deinit")
        }
    }
    var p:Person? = Person(name: "qbs")
    var a:Apartment? = Apartment(number:888)
     
    p!.apartment = a  人有一套公寓
    a!.tenant = p!  公寓中住着一个人
    p = nil
    a = nil
    输出结果:
    888 deinit
    qbs deinit
     
     
    class Person {
        let name:String  姓名
        人不一定有信用卡
        var card: CreditCard?
        init(name:String){
            self.name = name
        }
        deinit{
            print("(self.name) deinit")
        }
    }
    class CreditCard{
        let number: Int
        信用卡必须有所属用户
        当某一个变量/常量必须有值, 一直有值, 那么可以使用unowned修饰
        unowned let person: Person
        init(number:Int, person: Person){
            self.number = number
            self.person = person
        }
        deinit{
            print("(self.number) deinit")
        }
    }
    var p:Person? = Person(name: "qbs")
    var cc:CreditCard? = CreditCard(number: 8888888, person: p!)
    p = nil
    cc = nil
    输出结果:
    qbs deinit
    8888888 deinit
     
     
     
     
     
     
     
     
  • 相关阅读:
    【转】Entity Framework教程
    【转】《我的WCF之旅》博文系列汇总
    【转】无废话WCF系列教程
    【转】 wpf系列-入门
    基于Extjs的web表单设计器 第五节——数据库设计
    基于Extjs的web表单设计器 第四节——控件拖放
    基于Extjs的web表单设计器 第三节——控件拖放
    基于Extjs的web表单设计器 第二节——表单控件设计
    基于Extjs的web表单设计器 第一节
    基于Extjs的web表单设计器
  • 原文地址:https://www.cnblogs.com/jordanYang/p/5378587.html
Copyright © 2011-2022 走看看