Проект Typescript Ссылки с Webpack

Нет, есть определенные моменты, когда вы не хотели бы использовать [unowned self]. Иногда вы хотите, чтобы замыкание захватывало себя, чтобы убедиться, что оно все еще вокруг к тому времени, когда вызывается замыкание.

Пример: Выполнение асинхронного запроса сети

Если вы делая запрос асинхронной сети, вы хотите, чтобы закрытие сохраняло self, когда запрос заканчивается. Этот объект может быть иначе освобожден, но вы все еще хотите иметь возможность обрабатывать завершение запроса.

Когда использовать unowned self или weak self

Единственный раз, когда вы действительно хотите использовать [unowned self] или [weak self], когда вы создадите сильный ссылочный цикл . Сильный ссылочный цикл - это когда существует право собственности на объекты, в которых объекты становятся друг с другом (может быть, через третью сторону), и поэтому они никогда не будут освобождены, потому что они оба гарантируют, что друг друга будут придерживаться.

В конкретном случае закрытия вам просто нужно понять, что любая переменная, на которую ссылаются внутри нее, получает «собственность» по закрытию. Пока закрытие вокруг, эти объекты гарантированно будут вокруг. Единственный способ остановить это право собственности - сделать [unowned self] или [weak self]. Поэтому, если класс владеет закрытием, и это закрытие фиксирует сильную ссылку на этот класс, тогда у вас есть сильный ссылочный цикл между закрытием и классом. Это также включает в себя, если классу принадлежит то, что принадлежит закрытию.

В частности, в примере из видео

В примере на слайде TempNotifier владеет закрытием через onChange. Если они не объявили self как unowned, замыкание также будет иметь self, создавая сильный опорный цикл.

Разница между unowned и weak

Разница между unowned и weak заключается в том, что weak объявляется как необязательный, а unowned - нет. Объявив это weak, вы получите дело с тем, что в какой-то момент он может остаться в закрытии. Если вы попытаетесь получить доступ к переменной unowned, которая будет равна нулю, это приведет к сбою всей программы. Поэтому используйте unowned, когда вы уверены, что переменная всегда будет вокруг, а закрытие вокруг

0
задан user3334157 20 March 2019 в 13:28
поделиться