Swift-内存管理(高级)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MinggeQingchun/article/details/54293324

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 = stu0
stu0 = nil
stu1 = nil

//对象加入数组中,对象如果使引用数据类型,那么数组会强引用该对象(即数组让该对象的引用计数+1)
var stuArray = [Student(name:"san"),Student(name:"si")]
stuArray[0].name = "zhangsan"
//(1)当某个对象不再属于数组时,该对象引用计数-1
//数组本身被销毁时,它包含的所有对象不再属于它,因此如果数据是引用数据类型,它的引用计数将会-1
stuArray.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


展开阅读全文

没有更多推荐了,返回首页