Sobes.tech
Middle

iOS-də obyektin həyat dövrü haqqında danışın.

sobes.tech Süni İntellekt

AI-dan cavab

iOS-da obyektin həyat dövrü Reference Counting mexanizmi ilə idarə olunur. Ən yaygın üsul Automatic Reference Counting (ARC)-dir.

Həyat dövrünün mərhələləri:

  1. Yaradıcılıq (Creation): Obyekt sinfinin initsializasiyası ilə yaradılır. Referans sayğacı 1-ə qoyulur.

    // MyClass sinifindən obyektin initsializasiyası
    let myObject = MyClass() 
    
  2. İstifadə (Usage): Obyekt tətbiqdə istifadə olunur. Digər obyektlər ona referanslar ala bilər, bu da referans sayğacını artırır.

    // Digər obyekt referans alır
    anotherObject.referenceToMyObject = myObject 
    // myObject-in referans sayğacı artır
    
  3. Deallocation (Deallocation): Obyektin referans sayğacı sıfıra çatanda, runtime avtomatik olaraq deinit() metodunu çağırır (Objective-C sinifləri üçün dealloc). Obyekt istifadə olunan yaddaşı azad edir.

    deinit {
        // Resursları azad etmək üçün kod
        print("Obyekt silindi")
    }
    

Məsələlər və həllər:

  • Retain Cycles (Güclü referans döngələri): İki və ya daha çox obyektin güclü referanslar ilə bir-birinə bağlı olmasıdır. Hər bir obyektin referans sayğacı heç vaxt sıfıra çatmır və obyektlər deinitializasiya olunmur.
  • Həllər:
    • Weak References: weak açar sözü ilə göstərilir. Referans sayğacını artırmır. Müvəqqəti və ya opsional əlaqələr üçün valideyn obyektlərə və ya delegatlara istifadə olunur.
    • Unowned References: unowned açar sözü ilə göstərilir. Referans sayğacını artırmır. Əgər əlaqəli obyekt hər zaman eyni həyat dövrünə malikdirsə və referans nil olmayacaqsa, istifadə zamanı. Əgər unowned referans göstərilən obyekt deinitializasiya olunarsa, ona giriş runtime xətasına səbəb olar.

Güclü referans döngələrini qarşısını almaq üçün weakunowned closure nümunələri:

class Person {
    let name: String
    // Güclü döngünü qarşısını almaq üçün zəif referans
    var greeting: (() -> Void)? 

    init(name: String) {
        self.name = name
        // self-ni zəif referans kimi tut
        greeting = { [weak self] in 
            guard let self = self else { return }
            print("Salam, \(self.name)!")
        }
    }

    deinit {
        print("\(name) deinitializasiya olunur")
    }
}

class Apartment {
    let unit: String
    // Zəif referans kirayəçiyə
    weak var tenant: Person? 

    init(unit: String) {
        self.unit = unit
    }

    deinit {
        print("Mənzil \(unit) deinitializasiya olunur")
    }
}

Düzgün referansların idarə olunması yaddaş sızmalarını qarşısını almaq və tətbiqin stabilliyini təmin etmək üçün çox vacibdir.