6

Если вам нужно указать 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) 

ответ

3

Это не должно создавать ссылочный цикл, но даже если бы все было в порядке. Референтный цикл будет существовать только до завершения анимации, после чего он будет сломан. Создание короткоживущих эталонных циклов может быть полезным, потому что это гарантирует, что цель продолжает существовать для жизни вызова. Циклы не являются по своей сути проблемой. Непробиваемые Циклы - проблема.

Есть две причины, по которым это не создает цикл. Во-первых, нет «цикла». Система будет ссылаться на что-то (подробнее об этом в секунду), конечно. Но где ссылка на «вещь, которая ссылается на что-то?» Чтобы сказать это немного более четко, даже если система анимации ссылается на self, как self ссылается на систему анимации? Нет цикла.

Другая причина, по которой нет цикла, заключается в том, что вы не проходите self в систему анимации. Прохождение self.view.layoutIfNeeded. В Свифта, что эквивалентно:

UIView.layoutIfNeeded(self.view) 

Вы не проходя self здесь. Вы просматриваете представление. Теперь система анимации почти наверняка будет держать ссылку на этот вид, пока анимация не завершится, но это нормально. Это еще не цикл.

+1

Отличное объяснение, спасибо – Chris

1

Там нет ссылок цикла, поскольку self не фиксирует закрытие, но если вы не хотите, что это еще одна серьезная ссылка на self, вы можете использовать закрытие упаковки.

Если вы уверены, что self не будет освобожден в течение следующих 0,3 секунд, вы можете использовать unowned иначе weak. (Я бы использовал weak, чтобы быть уверенным, что он не сбой)

 Смежные вопросы

  • Нет связанных вопросов^_^