Sobes.tech
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 nil olur.
  • 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 nil olmur. 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

unownedweak arasındakı fərq:

  • weak istifadə et, obyekt ilk sərbəst buraxılanda nil ola bilər.
  • unowned istifadə 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.