Swift-内存管理(高级)

来源:互联网 发布:csol大刀优化软件 编辑:程序博客网 时间:2024/06/05 23:48

Swift-内存管理(高级)

/* 5、隐式强引用 */print("\n5、隐式强引用")class Student {    var name:String    init(name:String) {        self.name = name    }    func show() {        print("name=\(name)")    }    deinit {        print("\(name) deinit")    }}//此时,stu0和stu1都引用了同一个对象var stu0:Student? = Student(name:"Tom")var stu1 = stu0stu0 = nilstu1 = nil//对象加入数组中,对象如果使引用数据类型,那么数组会强引用该对象(即数组让该对象的引用计数+1)var stuArray = [Student(name:"san"),Student(name:"si")]stuArray[0].name = "zhangsan"//(1)当某个对象不再属于数组时,该对象引用计数-1//数组本身被销毁时,它包含的所有对象不再属于它,因此如果数据是引用数据类型,它的引用计数将会-1stuArray.remove(at: 0)/* 6、局部和全局引用 (1)作用域(2)生命周期 */print("\n6、局部和全局引用")/* 7、闭包属性引起的循环强引用 */print("\n7、闭包属性引起的循环强引用")class CycleRef{    var a:Int = 8    //如果闭包属性中没有直接或间接访问self,就不会产生循环引用    lazy var clouser: ()->Void = {//        print("clouser")        //默认闭包会对它访问的对象执行强引用        [unowned self] in //使用unowned使其变为弱引用        print("a=\(self.a)") //或以下方法//        [weak self] in//        print("a=\(self!.a)")//使用weak可能存在self为空时,需要对其进行解包或者判空,一般使用unowned居多    }    deinit {        print("deinit")    }}var cr:CycleRef? = CycleRef()//引用计数+1//前提:闭包或者函数是引用数据类型cr!.clouser() //引用计数+()?  闭包强引用了对象,对象调用闭包,循环引用cr = nil //引用计数-1


1 0
原创粉丝点击