Swift: Слабая ссылка на функцию закрытия?

В Swift я сейчас сталкиваюсь с проблемой, когда мне нужно часто переносить functions в closuresчтобы предотвратить циклы сильных ссылок при передаче функции класса в качестве параметра закрытия. Например, в сценарии ниже:

class A {
    var foo: () -> Void
}

class B {

    private let a: A

    init() {
        self.a = A()
        a.foo = { [weak self] in self?.foo() } // <- Can this be simplified, while still avoiding strong reference cycles?
    }

    private func foo() {}

}

Всегда печатать { [weak self] in self?.myFunc() } нехорошо, так как это открывает дверь людям, случайно вводящим утечки памяти, поскольку они забыли обернуть myFuncв закрытии. Есть ли более простой / надежный способ добиться подобного поведения?

-- Редактировать

Если более простого способа не существует, я, скорее всего, открою запрос функции @ Apple для синтаксиса, который выглядит примерно так:

init() {
    self.a = A()
    a.foo = weak foo
}

где a.foo = weak foo эквивалентно a.foo = { [weak self] in self?.foo() }

Или при работе с функциями, которые не принадлежат self:

let b = B()
let a = A()
a.foo = weakb.foo

где a.foo = weakb.foo эквивалентно a.foo = { [weakb] in b?.foo() }

Примечание: я не предлагаю сделать сами замыкания слабо привязанными. Я просто предлагаю этоweakb.foo компилируется идентично { [weakb] in b?.foo() }

0 ответов

Другие вопросы по тегам