Я просто хочу знать, правильно ли я понимаю это или нет. Таким образом, согласно документам 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)
}
}
}
Обратите внимание, как я ставлю [weak self] перед оператором in. Это позволяет замыканию знать, что оно содержит только слабую ссылку на себя, а не сильную ссылку. Предполагается, что IM использует «слабый», когда «я» может пережить закрытие, или «непринадлежащий», когда закрытие и «я» живут в течение одной и той же продолжительности.
Я получил эту информацию отсюда Автоматический подсчет ссылок а в разделе «Сильные ссылочные циклы для замыканий» этой ссылки есть это предложение «Сильный ссылочный цикл также может возникнуть, если вы назначаете замыкание свойству экземпляра класса, а тело этого замыкания захватывает экземпляр» Я примерно на 90% уверен, что правильно понял, но есть только 10% сомнений. Так это у меня правильно?
Причина, по которой я спрашиваю об этом, заключается в том, что я использую обратные вызовы для некоторых моих кнопок в своих представлениях. И эти обратные вызовы вызывают self, но self в этом сценарии — это контроллер представления, который отвечает на обратный вызов, а не само представление. Вот где я сомневаюсь в себе, потому что из того предложения, которое я выделил, я не думаю, что мне нужно ставить [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)
}
}