Как добиться односторонней ссылки в быстрых замыканиях

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

Проблема, с которой я сталкиваюсь, заключается в том, что когда я ссылаюсь на исходную операцию, она может быть освобождена до того, как последующие операции будут завершены. Закрытия, которые я использую, терпят неудачу, если у меня weak self, weak me = self или (катастрофически) unowned me = self на месте; но если я использую self без них ни одна операция не освобождает (утечка памяти).

Возможно ли сохранить ссылку изнутри замыкания, не создавая двусторонней циклической ситуации ссылки?

1 ответ

Прежде всего вам нужно спросить себя, является ли ваш self будет ноль в будущем или нет. Если да то weak а также unowned приходит в картинке.

Безопасный способ сделать это использовать weak и затем проверьте, был ли он освобожден или нет.

  your-closure { [weak self] in
      guard let strongSelf = self else {
          print("self is been deallocated")
          return
      }
  }

Когда замыкание выполняется в вышеуказанном случае, оно будет захватывать только weak self, В тот момент, когда закрытие начинается, weak self либо selfили это ноль. Вы можете проверить, если strongSelf установлен или нет.

Если weak self равно self, затем strongSelf сохраняет его, и он остается сохраненным до тех пор, пока закрытие не вернется после освобождения. Это все или ничего.

Другие вопросы по тегам