Почему сохраняется цикл сохранения? - PullRequest
0 голосов
/ 19 ноября 2018

Я использую Eureka , чтобы настроить мой вид таблицы.У меня есть раздел с заголовком:

Section() { [weak self] in
    guard let strongSelf = self else { return }
    var header = HeaderFooterView<MyView>(.nibFile(name: "MView", bundle: nil))
    header.onSetupView = strongSelf.setUpHeader(view:section:)
    $0.header = header
    ...
}

private func setUpHeader(view: MyView, section: Section) {
    // content here doesn't seem to make a difference.
}

По какой-то причине он всегда устанавливает цикл сохранения в строке header.onSetupView = strongSelf.setUpHeader(view:section:).Если я перемещу код из функции setUpHeader(view: MyView, section: Section) в такой блок, цикл сохранения не будет:

header.onSetupView = { [weak self] view, section in

}

Почему это ??

1 Ответ

0 голосов
/ 19 ноября 2018
header.onSetupView = strongSelf.setUpHeader(view:section:)

Эта строка создает сильную ссылку на strongSelf, которая является сильной ссылкой на self, настолько транзитивно, что создает сильную ссылку на self в закрытии onSetupView.

Другими словами, то, что вы здесь написали, совпадает с:

header.onSetupView = { view, section in
    strongSelf.setupHeader(view: view, section: section)
}

И поскольку strongSelf является сильной ссылкой на self, это то же самое, что и сильная ссылка на self:

header.onSetupView = { view, section in
    self.setupHeader(view: view, section: section)
}

И еще один способ сказать это: self не может быть освобожден раньше, чем strongSelf, потому что тогда strongSelf будет недопустимой ссылкой.

...