Middle+
iOSтогу эс тутум кандайча түзүлгөн?
sobes.tech AI
AIден жооп
iOS көп түрлүү хиерархийн санах ойн бүтэц ашигладаг:
-
RAM (Тасралтгүй хандах санах ой):
- Түргэн, эрчим хүч хамааралтай төрөл санах ой.
- идэвхтэй ажиллаж буй програмууд болон өгөгдлийг хадгалах зориулалттай.
- Үүнийг үйлдлийн систем болон ARC (Automatic Reference Counting) механизм удирддаг.
- Санах ойн дутагдлаар систем хамгийн бага идэвхтэй програмуудыг хааж болно.
-
Гүнзгий суулгасан санах ой (NAND Flash):
- RAM-аас удаан, гэхдээ эрчим хүчнаас хамааралгүй.
- Үүнийг үйлдлийн систем, програмууд, хэрэглэгчийн өгөгдөл (зураг, видео, баримт бичиг) хадгалах зориулалттай.
- Хязгаарлагдмал бичих циклийн тоотой.
-
Кэш санах ой (L1, L2, L3):
- Маш хурдан процессорын түвшний санах ой.
- Тогтмол ашиглагддаг заавар, өгөгдлийг хадгалах зорилгоор ашигладаг.
ARC (Automatic Reference Counting)
- Swift болон Objective-C-д санах ойн удирдлагын механизм, энэ нь автоматаар объектууд руу хандсан холбоосуудыг хянаж удирддаг.
- Бүх объектод холбоосын тоолуур байдаг. Тэр тоо 0-д хүрэхэд объектын эзлэж байсан санах ой чөлөөлөгддөг.
- Санах ойн урсгалыг урьдчилан сэргийлдэг боловч, эрсдэлтэй холбоосууд (
strong reference cycles) дээр анхаарал шаарддаг, эдгээрийгweakэсвэлunownedхолбоосоор шийдвэрлэж болно.
Виртуал санах ой
- iOS виртуал санах ой ашигладаг, энэ нь програмуудад физик RAM-аас илүү хаягийн орон зай ашиглах боломжийг олгодог.
- Санах ойн хуудаснууд RAM болон файлын системийн хооронд шилжиж болно (гэхдээ iOS-д энэ хязгаарлагдмал, ихэвчлэн ашиглаагүй хуудас цэвэрлэх замаар, диск рүү шилжүүлэхгүйгээр, macOS шиг).
- "Компрессийн санах ой" гэх мэт механизмүүд хуудаснуудыг шахаж хадгалахгүйгээр шахаж болно.
Програм дахь санах ойн удирдлага
- Хөгжүүлэгч ихэвчлэн ARC-ээр санах ойтой ажилладаг.
- Санах ойн урсгалыг зайлсхийх, зөвхөн
weakбаunownedашиглах нь чухал. - Санах ойн хэрэглээг оновчтой болгох, жишээ нь, нөөцийг шаардлагатай үед ачаалж, үр ашигтай өгөгдлийн бүтэц ашиглах, хэт олон объект үүсгэхээс зайлсхийх.
- Xcode Instruments (Allocations, Leaks) гэх мэт хэрэгслүүд санах ойн хэрэглээг профайл хийх, урсгалыг илрүүлэхэд ашиглагддаг.
weak-ийг эргэх хүчтэй холбоосоос зайлсхийх жишээ:
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? // Энд '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
// Хэрвээ `tenant` нь хүчтэй байсан бол, john ба unit4A
// объектууд деинициализац болохгүй байв
john = nil // deinit дуудна
unit4A = nil // deinit дуудна