Middle
Mis vahe on prügikorjajal (garbage collector) ja automaatse mälu haldamise (ARC) vahel?
sobes.tech AI
Vastus AI-lt
Automaatne mälu kogujaja leiab ja vabastab automaatselt mälu, mida programm enam ei kasuta. Ta töötab taustal, perioodiliselt skaneerides virna ja tuvastades objektid, millele ei ole aktiivseid viiteid.
ARC (Automatic Reference Counting) Swift ja Objective-C haldab objektide elu, lugedes iga objekti tugevate viidete arvu. Kui tugevate viidete arv jõuab nullini, vabastab ARC automaatselt selle objekti poolt kasutatud mälu.
Peamised erinevused:
| Omadus | Mälu kogujaja | ARC |
|---|---|---|
| Tööpõhimõte | Juurdepääsmatute objektide otsimine | Tugevate viidete arvutamine |
| Vabastamise hetk | Ebapraktiline, skaneerimise ajal | Deterministlik, kui viited on 0 |
| Ülalpidamiskulud | Peatused programmi täitmisel | Väikesed, muutudes loendurit |
| Prognoositavus | Madal | Kõrge |
| Tsüklilised viited | Vajavad spetsiaalseid lähenemisi (nt nõrgad viited) | Vajavad weak või unowned viiteid |
| Kasutamine iOS-is | Ei ole saadaval kaasaegses Objective-C ja Swiftis | Peamine mälu haldamise mehhanism Objective-C ja Swiftis |
Näide weak kasutamisest, et vältida tugeva viite tsüklit ARC-is:
class Person {
let name: String
var apartment: Apartment? // tugev viide
init(name: String) {
self.name = name
print("\(name) alustab tööd")
}
deinit {
print("\(name) lõpetab tööd")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // nõrk viide
init(unit: String) {
self.unit = unit
print("Apartment \(unit) alustab tööd")
}
deinit {
print("Apartment \(unit) lõpetab tööd")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // nõrk viide väldib tsüklit
john = nil // Person objekt deiniialiseerub
unit4A = nil // Apartment objekt deiniialiseerub