Sobes.tech
Junior — Middle

V ktorých prípadoch je vhodnejšie použiť unowned namiesto weak pri správe pamäte?

sobes.tech AI

Odpoveď od AI

V Swift-u se weak i unowned koriste za sprečavanje cikličkih jakih referenci, ali se primenjuju u različitim situacijama:

  • weak je opcionalna referenca koja automatski postaje nil kada objekat na koji se odnosi bude oslobođen. Koristi se kada referenca može postati nil tokom životnog veka objekta.

  • unowned je ne-opcionalna referenca koja pretpostavlja da će objekat na koji se odnosi uvek postojati tokom korišćenja te reference. Ako objekat bude oslobođen, pristup unowned će izazvati grešku u izvršavanju.

Preporučuje se korišćenje unowned kada:

  • Referenca uvek treba da ukazuje na postojeći objekat (npr. roditeljski objekat koji živi duže od deteta).
  • Sigurni ste da životni vek objekta na koji se odnosi neće biti kraći od životnog veka reference.

Primer:

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)

Ovde, CreditCard ima unowned referencu na Customer, jer kartica ne može postojati bez klijenta, a klijent živi duže od kartice.