美文网首页
9.内存管理与异常处理

9.内存管理与异常处理

作者: LucXion | 来源:发表于2020-06-09 11:06 被阅读0次

打印变量、常量内存地址

func printAddress(any:Any,des:String) {
    print("\(des) = \(Unmanaged<AnyObject>.passRetained(any as AnyObject).toOpaque())")
}
func printAddress(any:Any) {
    print("\(Unmanaged<AnyObject>.passRetained(any as AnyObject).toOpaque())")
}

对象间的循环引用

// 可选值属性比较好处理,加weak就可以, 非可选值属性需要 隐式解析 + unowned
class People {
    unowned var stu:Student
    init(parama:Student) {
        stu = parama
    }
    deinit {
        print("people被释放")
    }
}
class Student {
    var people:People!
    init() {
        people = People.init(parama: self) // 隐式解析可以忽略构造方法中的安全性原则,其告诉编译器,默认此属性是构造完成的
    }
    deinit {
        print("student被释放")
    }
}
if true {
    var stu = Student.init()
    var peo = stu.people
}

闭包是一种特殊的语法结构,在其中使用的引用类型的实例都会使引用计数加1。因此,如果在闭包属性中使用到self关键字,就会对当前类实例本身进行引用计数加1。由于此闭包又是当前类的一个属性,闭包属性无法销毁,则当前类实例也就无法销毁。反过来,当前类实例无法销毁,闭包属性也无法销毁。如此产生循环引用,将造成内存泄漏。

class People {
    var name = "HH"
    var home:String?
    lazy var closeBlock:()->Void = {
// 使用捕获列表对闭包中使用到的self进行无主引用
        [unowned self]()->Void in
        print("a = \(self.name),\(self.home)")
    }
    deinit {
        print("People被释放了")
    }
}
if true {
    var p = People.init()
    p.closeBlock()
}

相关文章

网友评论

      本文标题:9.内存管理与异常处理

      本文链接:https://www.haomeiwen.com/subject/ghtstktx.html