Middle+
როგორ არის მოწყობილი მეხსიერება iOS-ში?
sobes.tech AI
პასუხი AI-სგან
iOS მრავალ ტიპის ჰიერქსურას მეხსიერების სტრუქტურას იყენებს:
-
RAM (საკამათო მეხსიერება):
- სწრაფი, ენერგიაზე დამოკიდებული მეხსიერების ტიპი.
- გამოიყენება აქტიურად მუშაობა პროგრამებისა და მონაცემების შენახვაზე.
- მართავს ოპერაციული სისტემა და ARC (Automatic Reference Counting) მექანიზმი Swift/Objective-C ობიექტებისთვის.
- მეხსიერების ნაკლებობის შემთხვევაში, სისტემა შეიძლება დახუროს (ტერიმინიროს) ნაკლებად აქტიური პროგრამები.
-
შენახული მეხსიერება (NAND Flash):
- ნელი RAM-ის შედარებით, მაგრამ ენერგიაზე დამოუკიდებელი.
- გამოიყენება ოპერაციული სისტემის, პროგრამების, მომხმარებლის მონაცემების (ფოტოები, ვიდეოები, დოკუმენტები) შენახვაზე.
- აქვს შეზღუდული ციკლური გადაწერის რაოდენობა.
-
კეშ-მეხსიერება (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-ისთვის