Почему ClassA не сохраняет ссылку на Class C через ссылку на ClassB, который является свойством ClassC - PullRequest
2 голосов
/ 08 мая 2020

Хотя ClassA не имеет прямой ссылки на ClassC. Если мы вставим ту же ссылку b, что и ClassA, в ClassC, почему ClassC не сохраняется, если он сохраняет эту ссылку в b? Почему это сохраняется только в том случае, если мы создаем ссылку в ClassA на ClassC напрямую?

class ClassA {
    var b: ClassB?

    func someFunc() {
        let b = ClassB()
        self.b = b
        let c = ClassC(b: b)
        c.doSomething()
    }
}


class ClassB {}

class ClassC {
    private let b: ClassB
    init(b: ClassB) {
        self.b = b
    }

    func doSomething() {
        print("doSomething")
    }

    deinit {
        print("C deinit")
    }
}

let a = ClassA()
a.someFunc()

1 Ответ

1 голос
/ 08 мая 2020

Кажется, вы думаете, что свойство b в ClassC содержит сильную ссылку на экземпляр ClassC, который его содержит, но это не так. Свойства не содержат неявных ссылок на то, что их содержит. Следовательно, локальная переменная ClassC, созданная в someFunc, остается активной только до конца someFunc, потому что ничто не содержит сильной ссылки на нее.

...