Нужно ли использовать __weak самостоятельно внутри 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];
}];
Должны ли мы использовать здесь слабое я?
Ответы
Ответ 1
Это не цикл сохранения. Цикл сохранения будет
self -> block -> self
В этом случае мы имеем
animation framework -> block
block -> self
где первое сохранение является временным - блок освобождается при завершении анимации. Даже если цикл сохранения происходит, он будет только временным и не будет препятствовать освобождению объекта.
Ответ 2
Вы должны использовать __weak
когда цикл сохранения возможен. Это не тот случай, потому что блок анимации не сохраняется сам.
Еще одна ситуация с использованием __weak
- это продолжительное действие, которое вызовет наш блок после завершения, а self
может быть освобожден во время этого действия. Например, некоторый сетевой запрос вызовет обновление интерфейса для нашего контроллера представления в блоке завершения. Пользователь может выйти из нашего экрана во время запроса. В этой ситуации нет необходимости сохранять self
с блоком, лучше использовать слабое я. Но использование блоков анимации не является такой ситуацией.
Ответ 3
Нет, он не будет создавать цикл сохранения, потому что блок (закрытие) не привязан к self
.
Для получения дополнительной информации, пожалуйста, проверьте Apple Automatic Reference Counting.