Почему блоки создают цикл сохранения при обращении к себе?

Я прочитал много статей, в которых говорится о блоках, создающих цикл удержания. Но зачем ему цикл сохранения? Разве блок не выпустит ссылку после запуска?

[UIView animateWithDuration:5
                 animations:^{
            self.variable = somevalue;
}];

Например, если бы вышеперечисленное было выполнено, ссылка на себя была бы освобождена, верно?

Я уже вижу, что приведенный выше блок создает две сильные ссылки. Один от объекта к блоку и от блока к объекту. Может кто-нибудь объяснить мне, почему цикл не разрывается? Разве цикл не должен прерываться после запуска кода?


person DerrickHo328    schedule 07.07.2014    source источник
comment
Проблема возникает только в том случае, если self также сохраняет блок.   -  person rmaddy    schedule 07.07.2014
comment
К вашему сведению - Objective-C чувствителен к регистру. Ваш вопрос также должен быть (по крайней мере, код, который вы публикуете).   -  person rmaddy    schedule 07.07.2014


Ответы (1)


Если объект содержит блок, а блок содержит объект, то это цикл.

Если кто-то другой держит блок, а блок содержит объект, то цикл существует только в том случае, если объект прямо или косвенно удерживает того, кто держит блок.

Блоки не разрушаются при запуске, поэтому цикл будет прерван только в том случае, если блок будет освобожден.

person Tommy    schedule 07.07.2014
comment
Итак, исходя из вашего ответа, uiview animateswithduration: animation: не будет создавать цикл, поскольку uiview удерживает блок. - person DerrickHo328; 07.07.2014
comment
И если я использую dispatch_async, он также не создаст цикл сохранения ... Верно? - person DerrickHo328; 07.07.2014
comment
И то и другое должно быть правдой, да. Хотя часто люди предпочитают сохранять weak ссылку в асинхронном блоке любого вида, чтобы искусственно не продлевать время жизни соответствующего объекта. Это больше похоже на dispatch_async комментарий, чем на UIView +animateWithDuration:... комментарий - часть завершения последнего произойдет позже, но не позже фиксированного времени, которое вы установили для анимации, которое обычно крошечное. - person Tommy; 07.07.2014