Вызывает ли передача функции, принадлежащей self, цикл сохранения, когда он не находится в замыкании?
Если вам нужно ссылку self
внутри замыкания, это хорошая практика, чтобы передать его как weak
или же unowned
чтобы предотвратить сохранение цикла.
Если я передам функцию, которая принадлежит self
напрямую, это приведет к сохранению цикла? Или это нужно вкладывать в замыкание, чтобы ослабить себя?
Проходя прямо
UIView.animateWithDuration(0.3,
delay: 0.0,
usingSpringWithDamping: 0.7,
initialSpringVelocity: 0.1,
options: .CurveEaseOut,
animations: self.view.layoutIfNeeded, // does this cause retain cycle?
completion: nil)
Заворачивание в закрытие
UIView.animateWithDuration(0.3,
delay: 0.0,
usingSpringWithDamping: 0.7,
initialSpringVelocity: 0.1,
options: .CurveEaseOut,
animations: { [unowned self] in
self.view.layoutIfNeeded()
},
completion: nil)
2 ответа
Это не должно создавать ссылочный цикл, но даже если это будет сделано, все будет в порядке. Референтный цикл будет существовать только до завершения анимации, и в этот момент он будет прерван. Создание кратковременных эталонных циклов на самом деле может быть полезным, поскольку оно гарантирует, что цель продолжает существовать в течение всего срока вызова. Циклы не являются проблемой по своей сути. Неразрушимые циклы являются проблемой.
Есть две причины, по которым это не создает цикл. Во-первых, нет "цикла". Система будет ссылаться на что-то (подробнее об этом через секунду), конечно. Но где ссылка на "вещь, которая ссылается на это что-то?" Проще говоря, даже если на систему анимации ссылаются self
, как self
ссылаясь на систему анимации? Там нет цикла.
Другая причина отсутствия цикла в том, что вы не проходите мимо self
в любом случае в систему анимации. Ваше прохождение self.view.layoutIfNeeded
, В Swift это эквивалентно:
UIView.layoutIfNeeded(self.view)
Ты не проходишь мимо self
Вот. Вы передаете представление. Теперь система анимации почти наверняка будет содержать ссылку на этот вид до завершения анимации, но это нормально. Это все еще не цикл.
Там нет эталонного цикла, так как self
не фиксирует закрытие, но если вы не хотите, есть еще одна сильная ссылка на self
Вы можете использовать упаковочную крышку.
Если вы уверены, что self
не освобождается в течение следующих 0,3 секунд, которые вы можете использовать unowned
иначе weak
, (Я хотел бы использовать weak
просто чтобы быть уверенным, что он не потерпит крах)