Sobes.tech
Middle+

როგორ არის მოწყობილი მეხსიერება iOS-ში?

sobes.tech AI

პასუხი AI-სგან

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
// ობიექტები დეინიციალიზაციას ვერ განიცდიან
john = nil // deinit გამოიძახება john-ისთვის
unit4A = nil // deinit გამოიძახება unit4A-ისთვის