Middle+
Kaip yra suorganizuota atmintis iOS?
sobes.tech AI
Atsakymas iš AI
iOS naudoja hierarchinę atminties struktūrą su keliais tipais:
-
RAM (atsitiktinės prieigos atmintis):
- Greita, energijos priklausoma atminties rūšis.
- Naudojama aktyviai veikiančioms programoms ir duomenims saugoti.
- Valdo ją operacinė sistema ir ARC (Automatic Reference Counting) mechanizmas Swift/Objective-C objektams.
- Esant atminties trūkumui, sistema gali uždaryti (baigti) mažiau aktyvias programas.
-
Integruota atmintis (NAND Flash):
- Lėtesnė nei RAM, bet energijos nepriklausoma.
- Naudojama operacinės sistemos, programų, naudotojo duomenų (nuotraukos, vaizdo įrašai, dokumentai) saugojimui.
- Turi ribotą įrašymo ciklų skaičių.
-
Talpyklos atmintis (L1, L2, L3):
- Labai greita procesoriaus lygio atmintis.
- Naudojama dažnai naudojamų instrukcijų ir duomenų saugojimui, siekiant pagreitinti prieigą prie RAM.
ARC (Automatic Reference Counting)
- Atminties valdymo mechanizmas Swift ir Objective-C, kuris automatiškai stebi ir valdo nuorodas į objektus.
- Kiekvienas objektas turi nuorodų skaitiklį. Kai jis pasiekia nulį, užimta atmintis objektui laisvinama.
- Užkerta kelią atminties nutekėjimams, bet reikalauja dėmesio dirbant su ciklinėmis stipriomis nuorodomis (
strong reference cycles), kurias galima išspręsti naudojantweakarbaunownednuorodas.
Virtuali atmintis
- iOS naudoja virtualią atmintį, leidžiančią programoms naudoti didesnę adresų erdvę nei fizinė RAM.
- Atminties puslapiai gali būti perkeliami tarp RAM ir failų sistemos (nors iOS tai ribota, daugiausia per nenaudojamų puslapių valymą, o ne pilną diskų keitimą kaip macOS).
- Mechanizmai kaip "suspausta atmintis" gali suspausti puslapius vietoj jų rašymo į saugyklą.
Atminties valdymas programoje
- Kūrėjas daugiausia dirba su atmintimi per ARC.
- Svarbu išvengti atminties nutekėjimų, teisingai naudojant
weakirunowned. - Reikia optimizuoti atminties naudojimą, pvz., įkeliant išteklius pagal poreikį, naudojant efektyvias duomenų struktūras ir vengiant perteklinių objektų kūrimo.
- Įrankiai kaip Xcode Instruments (Allocations, Leaks) naudojami atminties naudojimo profilaktikai ir nutekėjimų paieškai.
Pavyzdys naudojant weak siekiant išvengti ciklinių stiprių nuorodų:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("Person \(name) is being initialized")
}
deinit {
print("Person \(name) is being deinitialized")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Naudokite 'weak'
init(unit: String) {
self.unit = unit
print("Apartment \(unit) is being initialized")
}
deinit {
print("Apartment \(unit) is being deinitialized")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john
// Jei tenant būtų stiprus, kai `john` ir `unit4A` būtų ištrinti
// Person ir Apartment objektai nebūtų deinitializuoti
john = nil // iškviečiama deinit
unit4A = nil // iškviečiama deinit