Подтвердить что ты не робот

Нужно ли использовать __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];
                                                  }];

Должны ли мы использовать здесь слабое я?

4b9b3361

Ответ 1

Это не цикл сохранения. Цикл сохранения будет

self -> block -> self

В этом случае мы имеем

animation framework -> block
block -> self

где первое сохранение является временным - блок освобождается при завершении анимации. Даже если цикл сохранения происходит, он будет только временным и не будет препятствовать освобождению объекта.

Ответ 2

Вы должны использовать __weak когда цикл сохранения возможен. Это не тот случай, потому что блок анимации не сохраняется сам.

Еще одна ситуация с использованием __weak - это продолжительное действие, которое вызовет наш блок после завершения, а self может быть освобожден во время этого действия. Например, некоторый сетевой запрос вызовет обновление интерфейса для нашего контроллера представления в блоке завершения. Пользователь может выйти из нашего экрана во время запроса. В этой ситуации нет необходимости сохранять self с блоком, лучше использовать слабое я. Но использование блоков анимации не является такой ситуацией.

Ответ 3

Нет, он не будет создавать цикл сохранения, потому что блок (закрытие) не привязан к self.
Для получения дополнительной информации, пожалуйста, проверьте Apple Automatic Reference Counting.