Квалификатор unowned
, такой как weak
, не позволяет закрытию устанавливать строгую ссылку на self
, что может помочь в предотвращении циклов сильных ссылок. Преимущество unowned
по сравнению с weak
заключается в том, что он более эффективен в оптимизированных сборках, не требуя, чтобы он отслеживал эту ссылку и возвращался и устанавливал ее на nil
, когда объект, на который он ссылается, освобождается. Ссылка unowned
также не является обязательной, то есть вам не нужно ее разворачивать, устраняя синтаксический шум и упрощая свой код.
Но вы, очевидно, не можете использовать unowned
в любой ситуации, когда объект может быть освобожден, поскольку он, очевидно, больше не может хранить ссылку на память для объекта, освобожденного из памяти.
Интересно, что evaluatePolicy(_:localizedReason:reply:)
документация гласит: «Этот метод асинхронно оценивает политику аутентификации». Каждый раз, когда вы работаете с асинхронным методом, не рекомендуется использовать unowned
, потому что Вы не можете быть уверены, что рассматриваемый объект не был освобожден за прошедшее время. Используйте unowned
только в тех конкретных ситуациях, когда вы точно знаете, что замыкание не может быть вызвано, если объект был освобожден. Похоже, что это не так.
Итог, используйте unowned
, чтобы избежать сильных циклов ссылок и там, где вы хотите более чистый, немного более эффективный код. Но только делают это, когда вы знаете, что невозможно освободить объект перед вызовом замыкания.