美文网首页
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