Почему я получаю удерживающий круг во втором примере? - PullRequest
0 голосов
/ 05 февраля 2019

Почему во втором примере мы получаем сильный ориентир, а в первом - нет?

class Test1 {
    var name: String = "Ted"
    lazy var greeting  = { return "Hello \(self.name)" }()
    deinit{print("goodby1")} // No retain cycle here ..
}
var v1:Test1? = Test1()
v1?.greeting
v1 = nil //prints goodby1, dealocation done

class Test {
    var name: String = "Mery"
    lazy var greeting = {return "Hello \(self.name)"}
    deinit{print("goodby")} //retain cycle here 

}
var v: Test? = Test()
v!.greeting
v = nil 

1 Ответ

0 голосов
/ 05 февраля 2019

В первом примере замыкание выполняется один раз, оно возвращает строку, и этой строке присваивается значение greeting.Там нет закрытия;ничто не захвачено.Это просто анонимная функция.Если хотите, вы можете избавиться от self., как в названной функции.Ключевым моментом является то, что тип greeting равен String.

Во втором примере greeting является значением замыкания, которое захватывает self.Поскольку self содержит greeting, а greeting содержит self, существует цикл.Ключевым моментом является то, что тип greeting равен () -> String.Это почти наверняка ошибка, так как это не то, как lazy предназначен для использования.

(lazy - довольно странная особенность в Swift, и, вероятно, было плохой идеей включать в языкЯ стараюсь избегать этого, насколько это возможно. Есть несколько хитрых способов использовать его неправильно, поэтому неудивительно, что он укусил вас.)

...