Что означает [не владеющий собой] и каковы преимущества?

Я пытаюсь интегрировать Face/Touch ID Логин, но я видел в документации яблоки [unowned self] в закрытии. Что это такое и каковы преимущества? Пример кода:

let context = LAContext()
    var error: NSError?

    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
        let reason = "Identify yourself!"

        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) {
            [unowned self] (success, authenticationError) in

            DispatchQueue.main.async {
                if success {
                    print("Authenticated!")
                } else {
                    // error
                }
            }
        }
    } else {
        // no biometry
    }

2 ответа

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

Но вы, очевидно, не можете использовать unowned в любой ситуации, когда объект может быть освобожден, поскольку он сохраняет ссылку на память, которую занимал рассматриваемый объект (что приводит к "висячему указателю").

Интересно, что evaluatePolicy(_:localizedReason:reply:) Документация гласит: "Этот метод асинхронно оценивает политику аутентификации". Каждый раз, когда вы имеете дело с асинхронным методом, не рекомендуется использовать unownedпотому что вы не можете быть уверены, что рассматриваемый объект не был освобожден. Использовать только unowned в тех конкретных ситуациях, когда вы точно знаете, что замыкание не может быть вызвано, если объект был освобожден. Это не похоже на случай здесь.

Итог, использование unowned для более чистого, немного более эффективного кода, но только тогда, когда вы знаете, что невозможно освободить объект перед вызовом закрытия.

Короче говоря, это так же, как weak!, поскольку неизвестные ссылки - это просто слабые ссылки, которые гарантированно имеют значение.

unowned используется, когда вы уверены, что ссылка НИКОГДА не будет равна нулю, и, следовательно, она может быть оценена только с ненулевыми значениями.

Подобно слабым ссылкам, неподдерживаемая ссылка не сохраняет сильного влияния на экземпляр, на который она ссылается. В отличие от слабой ссылки, однако, предполагается, что у неизвестной ссылки всегда есть значение. Из-за этого неопознанная ссылка всегда определяется как необязательный тип. (Apple Docs)

Проверьте этот другой ответ: в чем разница между слабой ссылкой и неподтвержденной ссылкой?

Документы: документация ARC

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