Нужно ли использовать __weak self внутри UIAnimationBlocks в ARC?
Нужно ли нам использовать __weak self внутри блоков UIAnimation, как указано ниже? Создаст ли это проблему сохранения цикла, если мы не указываем себя как слабого?
[UIView animateWithDuration:animationDuration
delay:0
options:UIViewAnimationCurveEaseInOut
animations:^{
[self doSomething];
} completion:^(BOOL finished) {
if (finished) {
[self doSomething];
}
}];
Я также запутался в следующем сценарии. Есть мысли по этому поводу? Пожалуйста, поделитесь своими комментариями.
[self.navController dismissViewControllerAnimated:animated
completion:^{
[self doSomething];
}];
Должны ли мы использовать слабое я здесь?
3 ответа
Это не удерживающий цикл. Сохранение цикла будет
self -> block -> self
В этом случае мы имеем
animation framework -> block
block -> self
где первое сохранение является только временным - блок освобождается, когда заканчивается анимация. Даже если цикл сохранения произойдет, он будет только временным и не помешает освобождению объекта.
Вам нужно использовать __weak
когда сохранить цикл возможно. Это не тот случай, потому что блок анимации не сохраняется самостоятельно.
Другая ситуация для использования __weak
это длительное действие, которое вызовет наш блок после завершения и self
может быть освобожден во время этого действия. Например, некоторый сетевой запрос вызовет обновление интерфейса для нашего контроллера представления в блоке завершения. Пользователь может выйти из нашего экрана во время запроса. В этой ситуации нет необходимости сохранять self
с блоком лучше использовать слабое Я. Но использование анимационных блоков тоже не такая ситуация.
Нет, это не создаст цикл сохранения, потому что блок (замыкание) не прикреплен к self
,
Для получения дополнительной информации, пожалуйста, проверьте автоматический подсчет ссылок Apple.