【问题标题】:Relative memory reference issue相对内存引用问题
【发布时间】:2020-05-02 03:08:23
【问题描述】:

在下面的代码中,我有一个人,一个人有一个地址(现在仅限城市)。

class Address {
    var city : String
    init(city : String) {
        self.city = city
    }

    deinit {
        print(self.city, "deinit")
    }
}


class Person {
    var name : String
    var age : Int
    var address : Address?

    init(name: String, age: Int, address : Address?) {
        self.name = name
        self.age = age
        self.address = address
    }

    class func createPerson( name : String, age : Int, address : Address? ) -> Person {
        let p  = Person(name: name, age: age, address: address)
        return p
    }

    deinit {
        self.address = nil
        print(self.name, " Deinit")
    }

}

问题案例 1:

如果我创建这样的对象并且我 nil 这个人,那么 london 就不会为零。

let london : Address? = Address(city: "London")
var jack : Person? = Person.createPerson(name: "Jack", age: 34, address: london)

jack = nil // jack de-init, london not de-init
// now london is the memory leak

问题案例 2:

如果我声明 london 为弱,那么 london deinit 但如果 london 引用其他人,那么它的地址也为零

weak var london : Address? = Address(city: "London")
var jack : Person? = Person.createPerson(name: "Jack", age: 34, address: london)
var elon : Person? = Person.createPerson(name: "Elon", age: 45, address: london)

jack = nil // jack de-init, london de-init 

print(elon?.address?.city) // nil

这个问题有交换解吗?

【问题讨论】:

    标签: ios memory


    【解决方案1】:

    这是预期的行为。 在您的情况 1 中,您当前使用的方法的上下文仍然引用了 london,这就是为什么它不应该被取消初始化的原因。这不是内存泄漏,当上下文关闭时,伦敦将被取消初始化,即。 e.当方法完成时。

    【讨论】:

    • 糟糕,我在操场上测试,忘记了这个愚蠢的原因。谢谢你的观点一直有效。 ????
    猜你喜欢
    • 2017-03-10
    • 2021-02-21
    • 2011-05-25
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多