Я просто хочу знать, правильно ли я понимаю это или нет. Таким образом, в соответствии с документами Apple, когда вы создаете замыкание как свойство экземпляра класса, и это замыкание ссылается на себя (класс, который создал свойство замыкания), это приведет к сильному циклу сохранения, в конечном счете, класс и замыкание никогда не будут освобождены. , Таким образом, в терминах непрофессионалов это означает, что если у меня есть класс, у которого есть свойство, и это свойство является замыканием, и как только я назначу функциональность этого замыкания внутри класса, который объявляет свойство замыкания, которое вызовет сильный цикл сохранения. Вот быстрый пример того, что я имею в виду
class SomeViewController{
let myClosure:()->Void
public func someFunction(){
....bunch of code
myClosure = {
self.dismiss(blahBlahBlah)
}
}
}
В конечном итоге это вызывает цикл сохранения, поскольку замыкание сохраняет сильную ссылку на себя, который является классом, который создает свойство замыкания. Теперь, чтобы исправить это в соответствии с Apple, я бы определил список захвата, например,
class SomeViewController{
let myClosure:()->Void
public func someFunction(){
....bunch of code
myClosure = { [weak self] in
self?.dismiss(blahBlahBlah)
}
}
}
Обратите внимание, как я поставил [слабое я] перед оператором in. Это позволяет закрытию знать только слабую ссылку на себя, а не на сильную ссылку. Предполагается, что IM использует слабое, когда «я» может жить вне замыкания, или «неизвестное», когда замыкание и «я» живут одинаково.
Я получил эту информацию отсюда Автоматический подсчет ссылок и в разделе «Сильные циклы ссылок для замыканий» этой ссылки есть предложение «Сильный цикл ссылок также может произойти, если назначить замыкание к свойству экземпляра класса, и тело этого замыкания захватывает экземпляр " Я примерно на 90% уверен, что я правильно понимаю, но есть только 10% сомнений. Так я правильно понял?
Причина, по которой я спрашиваю об этом, заключается в том, что я использую обратные вызовы для некоторых моих кнопок в моих представлениях. И эти обратные вызовы обращаются к себе, но само в этом сценарии является контроллером представления, который отвечает на обратный вызов, а не само представление. Это то, где я сомневаюсь в себе, потому что я из того предложения, которое я выделил, я не думаю, что мне нужно ставить [weak self]
на все эти обратные вызовы кнопок, но я просто проверяю. Вот пример этого
class SomeViewController {
let someSubview:UIView
override viewDidLoad() {
//Some Subview has a button and in that view I just have some action that gets fired off calling the callback here in the view controller I don't need to use the [weak self] in this scenario because closure property is not in this class correct?
someSubview.someButtonsCallback = {
....run code then
self?.dismiss(blahBlahBlah)
}
}