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

В каких случаях предпочтительно применять unowned вместо weak в управлении памятью?

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

sobes.tech AI

В Swift weak и unowned используются для предотвращения циклов сильных ссылок, но применяются в разных ситуациях:

  • weak — это опциональная ссылка, которая автоматически становится nil, когда объект, на который она ссылается, освобождается. Используется, когда ссылка может стать nil в процессе жизни объекта.

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

Предпочтительно использовать unowned, когда:

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

Пример:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
}

let john = Customer(name: "John Appleseed")
john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)

Здесь CreditCard имеет unowned ссылку на Customer, потому что карта не может существовать без клиента, и клиент живёт дольше карты.