Middle+
iOS'da xotira qanday tuzilgan?
sobes.tech AI
AIdan javob
iOS bir necha turdan iborat hierarxik xotira tuzilmasidan foydalanadi:
-
RAM (Tasodifiy kirish xotirasi):
- Tez, energiyaga bog'liq bo'lgan xotira turi.
- Faol dasturlar va ma'lumotlarni saqlash uchun ishlatiladi.
- Swift/Objective-C ob'ektlari uchun ARC (Avtomatik Referenslar Soni) mexanizmi va operatsion tizim tomonidan boshqariladi.
- Xotira yetishmovchiligi bo'lsa, tizim kamroq faol dasturlarni yopishi mumkin.
-
Ichki xotira (NAND Flash):
- RAMdan sekinroq, ammo energiyasiz.
- Operatsion tizim, dasturlar, foydalanuvchi ma'lumotlari (rasmlar, videolar, hujjatlar) uchun ishlatiladi.
- Cheklangan yozish tsikllari resursiga ega.
-
Kesh-xotira (L1, L2, L3):
- Protsessor darajasida juda tez xotira.
- Tez-tez ishlatiladigan ko'rsatmalar va ma'lumotlarni saqlash uchun ishlatiladi, RAMga kirishni tezlashtirish uchun.
ARC (Avtomatik Referenslar Soni)
- Swift va Objective-C'da xotira boshqarish mexanizmi bo'lib, u ob'ektlarga bo'lgan referentsiyalarni avtomatik ravishda kuzatib boradi va boshqaradi.
- Har bir ob'ektning referentsiya hisoblagichi bor. U nolga yetganda, ob'ekt tomonidan egallangan xotira bo'shatiladi.
- Xotira oqib ketishining oldini oladi, ammo
weakyokiunownedbilan ishlashda diqqat talab qiladi.
Virtual xotira
- iOS virtual xotira ishlatadi, bu dasturlarga fizik RAMdan ko'proq manzil maydonidan foydalanishga imkon beradi.
- Xotira sahifalari RAM va fayl tizimi o'rtasida ko'chirilishi mumkin (iOSda bu cheklangan, asosan ishlatilmaydigan sahifalarni tozalash orqali, diskda to'liq swap qilish emas, macOSda kabi).
- "siqilgan xotira" kabi mexanizmlar sahifalarni siqib, ularni saqlashga yozmasdan siqib chiqarishi mumkin.
Dasturda xotira boshqaruvi
- Dasturchi asosan ARC orqali xotira bilan ishlaydi.
weakvaunownedto'g'ri ishlatilishini ta'minlash orqali xotira oqib ketishlarini oldini olish muhim.- Xotira iste'molini optimallashtirish, masalan, resurslarni talab qilinishi bilan yuklash, samarali ma'lumot tuzilmalaridan foydalanish va ortiqcha ob'ektlar yaratishdan saqlanish.
- Xotira iste'molini profiling qilish va oqib ketishlarni aniqlash uchun Xcode Instruments (Allocations, Leaks) kabi vositalar ishlatiladi.
weak ni ishlatish misoli, kuchli referensiya aylanishlarini oldini olish uchun:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("Person \(name) boshlanmoqda")
}
deinit {
print("Person \(name) tugatilmoqda")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Bu yerda 'weak' ishlating
init(unit: String) {
self.unit = unit
print("Apartment \(unit) boshlanmoqda")
}
deinit {
print("Apartment \(unit) tugatilmoqda")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john
// Agar tenant kuchli bo'lsa, john va unit4A ni nil ga o'rnatganda,
// Person va Apartment ob'ektlari deinitialization bo'lmaydi
john = nil // deinit chaqiriladi
unit4A = nil // deinit chaqiriladi