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 automaatseltnil-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.