В приведенном ниже коде у меня есть Персона, и у человека есть адрес (сейчас только город).
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
Есть ли коммутативное решение этой проблемы?