Sobes.tech
Назад к вопросам
Junior — Middle
67

Как отличить использование unowned без параметров от unowned(unsafe) в коде?

Компании, где спрашивали
СБЕРСБЕР
МТСМТС

Ответ от нейросети

sobes.tech AI

В Swift ключевое слово unowned используется для объявления слабой ссылки без увеличения счётчика ссылок, при этом предполагается, что объект всегда будет существовать во время доступа к этой ссылке.

  • unowned без параметров — это обычная небезопасная слабая ссылка, которая не увеличивает счётчик ссылок и не является опциональной. Если объект уже освобождён, обращение к такой ссылке приведёт к крашу.

  • unowned(unsafe) — более низкоуровневый вариант, который не проверяет валидность ссылки вообще. Это значит, что ссылка ведёт на память, которая может быть уже освобождена, и доступ к ней — неопределённое поведение.

На практике:

class A {
    var closure: (() -> Void)?
    func setup() {
        closure = { [unowned self] in
            print(self)
        }
    }
}

Здесь unowned гарантирует, что self существует во время вызова замыкания, иначе будет краш.

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

Итого:

  • unowned — небезопасная, но с проверкой во время выполнения (краш при обращении к освобождённому объекту).
  • unowned(unsafe) — полностью небезопасная, без проверок, может привести к неопределённому поведению.