Sobes.tech
Middle+

Kako je organizovana memorija u iOS-u?

sobes.tech АИ

Одговор од АИ

iOS користи хиерархичку структуру меморије са више типова:

  1. Рам (RAM - Оперативна меморија):

    • Брза, енергетски зависна врста меморије.
    • Користи се за чување активно радијих апликација и података.
    • Управља је оперативни систем и механизам ARC (Automatic Reference Counting) за објекте Swift/Objective-C.
    • У случају недостатка меморије, систем може затворити (терминирати) мање активне апликације.
  2. Уграђена меморија (NAND Flash):

    • Спорија од RAM-а, али енергетски независна.
    • Користи се за чување оперативног система, апликација, корисничких података (фотографије, видео записи, документи).
    • Има ограничен број циклуса преписа.
  3. Кеш меморија (L1, L2, L3):

    • Веома брза меморија на нивоу процесора.
    • Користи се за чување често коришћених инструкција и података ради убрзања приступа RAM-у.

ARC (Automatic Reference Counting)

  • Механизам управљања меморијом у Swift и Objective-C, који аутоматски прати и управља референцама на објекте.
  • Сваког објекта има бројач референци. Када достигне нулу, меморија која заузима објекат се ослобађа.
  • Превентивно спречава губитак меморије, али захтева пажњу при раду са цикличним јаким референцама (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`
// објекти `Person` и `Apartment` не би били деинициализовани
john = nil // позив `deinit` за `john`
unit4A = nil // позив `deinit` за `unit4A`