Относительная проблема с памятью

В приведенном ниже коде у меня есть человек, и у человека есть адрес (сейчас только город).

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 этого человека, Лондон не обнуляется.

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:

Если я объявляю Лондон слабым, то Лондон деинит, но если Лондон ссылается на другого человека, то его адрес также становится нулевым

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

Есть ли коммутативное решение этой проблемы?

Всего 1 ответ


Это намеренное поведение. В вашем случае 1 на Лондон по-прежнему ссылается контекст метода, в котором вы сейчас находитесь, поэтому его не следует деинициализировать. Это не утечка памяти, Лондон будет деинициализирован, когда контекст закроется, т.е. когда метод будет завершен.


Есть идеи?

10000