Middle
iOS-də yaddaş idarəetməsindən danışın.
sobes.tech Süni İntellekt
AI-dan cavab
iOS avtomatik istinadların sayımını (ARC) yaddaş idarəetməsi üçün istifadə edir. ARC avtomatik olaraq obyektləri sərbəst buraxır, dərhal onlara istinadlar olmadıqda.
Əsas anlayışlar:
- Güclü İstinad: Obiektin istinad sayını artırır. Güclü istinadlar olduğu müddətdə obyekt sərbəst buraxılmayacaq.
- Zəif İstinad: Sayını artırmır. Güclü istinad dövrlərini qarşısını almaq üçün istifadə olunur. Obyekti göstərir ki, sərbəst buraxıla bilər. Əgər obyekt sərbəst buraxılırsa, zəif istinad
nilolur. - Unowned İstinad: Zəif istinada bənzəyir, sayını artırmır. Obiektin eyni və ya daha uzun ömürlü olduğu halda istifadə olunur. Unowned istinad obyekt sərbəst buraxıldıqda
nilolmur. Sərbəst buraxılmış obyektə unowned istinad vasitəsilə daxil olmaq icra zamanı xəta verir.
Güclü istinad dövrləri (Retain Cycles): İki və ya daha çox obyektin bir-birinə güclü istinadlar saxlaması nəticəsində yaranır və heç biri sərbəst buraxılmır. Zəif və ya unowned istinadlar ilə həll olunur.
Güclü istinad dövrlərinin nümunəsi və həlli:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) initialize olunur")
}
deinit {
print("\(name) deinitialize olunur")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Güclü istinadın qarşısını almaq üçün zəif istinad
init(unit: String) {
self.unit = unit
print("Apartment \(unit) initialize olunur")
}
deinit {
print("Apartment \(unit) deinitialize olunur")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // Burada dövr yaranır
john = nil
unit4A = nil
// Deinitializer metodları çağrılmır, çünki dövr mövcuddur
Zəif istifadə ilə həll:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) initialize olunur")
}
deinit {
print("\(name) deinitialize olunur")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Güclü dövrü qarşısını almaq üçün zəif istinad
init(unit: String) {
self.unit = unit
print("Apartment \(unit) initialize olunur")
}
deinit {
print("Apartment \(unit) deinitialize olunur")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
unit4A = nil
// Hər iki obyekt düzgün şəkildə deinitialize olunur
unowned və weak arasındakı fərq:
weakistifadə et, obyekt ilk sərbəst buraxılandanilola bilər.unownedistifadə et, obyektin hər zaman dəyəri olacaq (obyektin ömrü daha uzun və ya bərabərdir).
Closures və dövrlər:
Closures obyektlərə istinadlar tutaraq güclü dövrlər yarada bilər. Bu, capture list ilə həll olunur.
Nümunə:
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[weak self] in // self zəif capture olunur
guard let self = self else {
return ""
}
var html = "<\(self.name)"
if let text = self.text {
html += ">\(text)</\(self.name)>"
} else {
html += " />"
}
return html
}
init(name: String, text: String? = nil) {
self.name = name
self.text = text
}
deinit {
print("\(name) deinitialize olunur")
}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world")
print(paragraph!.asHTML())
paragraph = nil
// Obyekt deinitialize olunur
Yaddaş problemlərinin diaqnostikası:
- Memory Graph Debugger: Xcode-də obyektlər arasındakı əlaqələri vizuallaşdırır və güclü referans dövrlərini tapmağa kömək edir.
- Instruments (Allocations, Leaks): Yaddaşın ayırma və sərbəst buraxılmasını izləmək və sızmaları tapmaq üçün vasitələr.