Sobes.tech
Middle

Kas ir unowned Swift valodā un kā tas tiek izmantots?

sobes.tech AI

Atbilde no AI

Neposedinā atsauce (vājā netiešā īpašuma pārvaldība) Swift tiek izmantota, lai izvairītos no stipru atsauces cikliem (retain cycles), kad divi objekti stipri atsaucas viens uz otru, novēršot to atbrīvošanu no atmiņas.

unowned īpašības:

  • Nodrošina, ka objekts, uz kuru attiecas unowned atsauce, vienmēr pastāvēs līdz brīdim, kad tā tiks izmantota.
  • Ja mēģināsiet piekļūt unowned atsaucei pēc tam, kad saistītais objekts ir atbrīvots, notiks izpildes kļūda (runtime crash).
  • To izmanto, kad atsauces objekta dzīves cikls nav ilgāks par atsauces objekta dzīves ciklu. Citiem vārdiem, unowned atsauce nepadara objektu stiprāku.

Piemērs ar slēptu aizturēšanu:

class Customer {
    let name: String
    var card: CreditCard?

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) tiek atbrīvots")
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer // `unowned` atsauce uz Customer

    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }

    deinit {
        print("Karte #\(number) tiek atbrīvota")
    }
}

var john: Customer? // Opcijonāls Customer
john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)

// Ja piešķirsim nil, Customer un Card tiks atbrīvoti,
// jo nav stipra cikla
john = nil 

Vēl viens piemērs — unowned izmantošana slēptā:

class HTMLElement {
    let name: String
    let text: String?

    lazy var asHTML: () -> String = { [unowned self] in // Izmantojot unowned self
        if let text = self.text {
            return "<\(self.name)>\(text)</\(self.name)>"
        } else {
            return "<\(self.name) />"
        }
    }

    init(name: String, text: String? = nil) {
        self.name = name
        self.text = text
    }

    deinit {
        print("\(name) tiek atbrīvots")
    }
}

var paragraph: HTMLElement? // Opcijonāls HTML elements
paragraph = HTMLElement(name: "p", text: "hello world")
print(paragraph!.asHTML())

// Ja piešķirsim nil, HTMLElement tiks atbrīvots, jo slēptā neuztur to stipri
paragraph = nil

Izvēle starp unowned un weak ir atkarīga no tā, vai atsauce var kļūt par nil dzīves laikā. Ja atsauce nekad nevar kļūt par nil pirms objekta atbrīvošanas, izmantojiet unowned. Ja var — izmantojiet weak.