Вызывает ли передача функции, принадлежащей 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 просто чтобы быть уверенным, что он не потерпит крах)

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