Что означает [не владеющий собой] и каковы преимущества? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь интегрировать 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 ]

0 голосов
/ 22 января 2019

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

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

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

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

0 голосов
/ 22 января 2019

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

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

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

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

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

...