Относительная проблема с памятью - PullRequest
0 голосов
/ 15 января 2020

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

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 Ответ

2 голосов
/ 15 января 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...