Sobes.tech
Junior

Mis vahe on nõrkadel ja tugevatel linkidel?

sobes.tech AI

Vastus AI-lt

Erinevus mälu haldamise mehhanismis (ARC - Automaatne viitearvutamine):

  • Tugev viide (Strong reference): suurendab objekti viidete loenduri 1-iga. Objekt ei saa mälust vabastada, kuni sellel on vähemalt üks tugev viide. See on Swiftis vaikimisi käitumine omaduste ja muutujate puhul:

  • Nõrk viide (Weak reference): ei suurenda objekti viidete loenduri. Kasutatakse tsükliliste viidete vältimiseks, kui kaks või enam objekti omavad üksteisele tugevaid viiteid, mis põhjustab mälulekke. Nõrk viide on alati valikuline (Optional), kuna viide objekti võib igal ajal tühistada. Kui objekt tühistatakse, muutub nõrk viide automaatselt nil-iks:

Näide tsüklilise viite vältimisest nõrga viitega:

class Person {
    let name: String
    var apartment: Apartment? // alguses tugev viide
    init(name: String) { self.name = name }
    deinit { print("\(name) on vabastatud") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // nõrk viide
    init(unit: String) { self.unit = unit }
    deinit { print("Korter \(unit) on vabastatud") }
}

var john: Person? // Person objekt
var unit4A: Apartment? // Apartment objekt

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Tsüklilise viite loomine:
// john omab tugevat viidet korterile
// korter omab tugevat viidet inimesele
john!.apartment = unit4A
unit4A!.tenant = john // see peab olema nõrk, et katkestada tsükkel

john = nil // määrates john nil-iks, see ei vabastata, kui tsükkel eksisteerib
unit4A = nil // sama, kui tsükkel eksisteerib, see ei vabastata

// Oodatav väljund:
// John Appleseed on vabastatud
// Korter 4A on vabastatud

Kui weak ei kasutataks tenant jaoks, ei kutsutaks deinit-ide funktsioone, mis näitab mäluleket.