11

Нужно ли использовать __weak self внутри блоков UIAnimation, как указано ниже? Будет ли это создавать проблему сохранения цикла, если мы не будем определять себя как слабое?Нужно ли использовать __weak self внутри UIAnimationBlocks в ARC?

[UIView animateWithDuration:animationDuration 
         delay:0 
        options:UIViewAnimationCurveEaseInOut 
       animations:^{ 
     [self doSomething]; 
    } completion:^(BOOL finished) { 
     if (finished) { 
      [self doSomething]; 
     } 
    }]; 

Я также смущен в следующем сценарии. Любые мысли по этому поводу? пожалуйста, поделитесь своими комментариями.

[self.navController dismissViewControllerAnimated:animated 
             completion:^{ 
                 [self doSomething]; 
                }]; 

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

+0

Спасибо, ребята, я становлюсь все яснее и яснее. Я хотел бы обсудить и следующий случай. [self.navController rejectViewControllerAnimated: анимированное завершение:^{ [self doSomething]; }]; –

ответ

23

Это не цикл удержания. Сохранить цикл будет

self -> block -> self 

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

animation framework -> block 
block -> self 

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

+0

Что касается следующего случая void (^ animateBlock) (void) =^(void) { [self doSomething]; }; –

+0

@ arango_86 Это тот же случай, который вы написали в своем вопросе. Чтобы создать цикл сохранения, вы должны сначала создать свойство на своем объекте, например. '@property (nonatomic, copy) void (^ animateBlock) (void)', а затем назначить ему 'self.animationBlock =^(void) {[self doSomething]; }; '. – Sulthan

+0

Использование слабой самости в анимации по-прежнему является хорошим, так что это не будет препятствовать выпуску диспетчера представлений, когда он выходит из поля зрения, - и нет смысла запускать анимацию, когда контроллер просмотра больше не отображается. – Boon

1

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

2

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

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