Sobes.tech
Junior — Middle

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

sobes.tech AI

Отговор от 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, защото картата не може да съществува без клиента, а клиентът живее по-дълго от картата.