Sobes.tech
Junior — Middle

Milyen esetekben érdemes az unowned-t használni a weak helyett a memória kezelésében?

sobes.tech MI

Válasz az MI-től

Swiftben a weak és unowned a erős hivatkozási ciklusok megelőzésére szolgál, de különböző helyzetekben alkalmazzák őket:

  • A weak egy opcionális hivatkozás, amely automatikusan nil lesz, amikor a hivatkozott objektum felszabadul. Akkor használják, amikor a hivatkozás az objektum életciklusa során nil lehet.

  • Az unowned egy nem-opcionális hivatkozás, amely feltételezi, hogy a hivatkozott objektum mindig létezni fog a hivatkozás használata közben. Ha az objektum felszabadul, az unowned-hoz való hozzáférés futási hibát okoz.

Az unowned használata előnyösebb, amikor:

  • A hivatkozás mindig egy létező objektumra mutat (például egy szülőobjektum, amely hosszabb ideig él, mint a gyermek).
  • Biztos vagy benne, hogy a hivatkozott objektum élettartama nem lesz rövidebb, mint a hivatkozásé.

Példa:

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)

Itt a CreditCard rendelkezik egy unowned hivatkozással a Customer-re, mert a kártya nem létezhet ügyfél nélkül, és az ügyfél hosszabb ideig él, mint a kártya.