Ваш пример на самом деле недостаточно надуманен. Давайте сделаем это проще:
class C {
lazy var f: () -> () = {
[unowned self] in
print(self)
}
init() {}
func doF() {
self.f()
}
deinit {
print("C is being deinitialized")
}
}
Теперь давайте проверим это:
let c = C()
c.doF()
Результат: когда c
выходит из области видимости, мы видим "C деинициализируется".
Хорошо, но теперь удалите [unowned self] in
. Теперь, когда мы проверяем это, мы не видим "C деинициализируется". У нас есть цикл сохранения.
Так что да, у вас есть self
, сохраняющая функцию, которая ссылается на self
, это цикл сохранения. Вы правы, чтобы разорвать цикл с unowned self
.
(Конечно, в моем примере я учитываю, как ваш lazy
усложняет картину. Если мы не скажем self.f()
- то есть, если мы никогда не попросим lazy var
инициализировать сам по себе - тогда, конечно, не имеет значения что такое инициализатор для f
: он никогда не инициализируется, поэтому не может быть никакого цикла сохранения. Но это крайне невероятный сценарий, если вы никогда не собираетесь для инициализации lazy var
тогда у вас не будет lazy var
для начала.)