Sobes.tech
Middle+

iOSтогу эс тутум кандайча түзүлгөн?

sobes.tech AI

AIден жооп

iOS көп түрлүү хиерархийн санах ойн бүтэц ашигладаг:

  1. RAM (Тасралтгүй хандах санах ой):

    • Түргэн, эрчим хүч хамааралтай төрөл санах ой.
    • идэвхтэй ажиллаж буй програмууд болон өгөгдлийг хадгалах зориулалттай.
    • Үүнийг үйлдлийн систем болон ARC (Automatic Reference Counting) механизм удирддаг.
    • Санах ойн дутагдлаар систем хамгийн бага идэвхтэй програмуудыг хааж болно.
  2. Гүнзгий суулгасан санах ой (NAND Flash):

    • RAM-аас удаан, гэхдээ эрчим хүчнаас хамааралгүй.
    • Үүнийг үйлдлийн систем, програмууд, хэрэглэгчийн өгөгдөл (зураг, видео, баримт бичиг) хадгалах зориулалттай.
    • Хязгаарлагдмал бичих циклийн тоотой.
  3. Кэш санах ой (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 дуудна