Middle
Siniflərin ilkinləşdirilməsi yaddaş ayırması ilə necə əlaqəlidir?
sobes.tech Süni İntellekt
AI-dan cavab
Sınıfın (obyektin) nümunəsini yaratdıqda, sistem onun xüsusiyyətləri və metadatalarını saxlamaq üçün yaddaş blokunu ayırır. (init) - bu xüsusi metod, yaddaş blokunu ayırdıqdan sonra və tam olaraq başlanğıc vəziyyətinə gətirilmiş obyekt geri qaytarılmadan əvvəl konfiqurasiya etmək üçün çağırılır.
Proses aşağıdakıları əhatə edir:
- Yaddaş ayırma: Əməliyyat sistemi (Swift/Objective-C icra mühiti vasitəsilə) lazım olan yaddaş miqdarını yığma (heap) yaddaşında rezerv edir. Ölçü, sinifin növü, onun xüsusiyyətlərinin sayı və növlərinə bağlıdır.
- Xüsusiyyətlərin başlanması: Başlanğıcçı, nümunənin bütün saxlanılan xüsusiyyətlərinin başlanğıc dəyərlər almasını təmin edir. Bu çox vacibdir, çünki başlanmamış xüsusiyyətlər qeyri-müəyyən vəziyyətə və işləmə zamanı səhvlərə səbəb ola bilər.
initçağırışı: Müvafiq sinif başlanğıcçısı çağırılır, obyektin vəziyyətini tənzimləmək üçün lazım olan məntiqi icra edir. Bu, xüsusiyyətlərə dəyərlər təyin etmək, digər metodları çağırmaq və ya digər başlanğıc işlərini həyata keçirmək ola bilər.- Obyektin geri qaytarılması: Uğurlu
initicrasından sonra, icra mühiti yeni yaradılmış və başlanmış obyektə göstərici qaytarır.
Swift-də təhlükəsizliyi təmin edən başlanğıc qaydaları mövcuddur:
- Bütün nümunənin saxlanılan xüsusiyyətləri sinifin
init-inin sonunda başlanğıc dəyərinə malik olmalıdır. - Bir xüsusiyyətə dəyər təyin etmədən əvvəl, onun yaddaşı ayırılmalıdır.
- Törəmə sinifin
init-i, valideyn sinifininit-ini çağırmadan əvvəl öz xüsusiyyətlərini başlatmalıdır (iki mərhələli başlanğıc).
Başlanğıc və yaddaş arasındakı əlaqənin nümunəsi:
class MyClass {
let myProperty: Int // Başlanğıc tələb edən saxlanılan xüsusiyyət
init(value: Int) {
self.myProperty = value // Xüsusiyyəti başlatır, onun üçün yaddaş artıq təyin olunub
// 'myProperty' üçün yaddaş, MyClass nümunəsi yaradıldıqda ayırılıb,
// amma onun dəyəri burada `init`-də təyin edilir.
}
// Əgər açıq `init` təmin edilməzsə, Swift standart `init`-i təmin edə bilər
// əgər bütün xüsusiyyətlər standart dəyərlərə və ya opsionaldırsa.
// Bu halda, 'myProperty' standart dəyərə malik deyil,
// ona görə də onu təyin etmək üçün `init` tələb olunur.
}
// Nümunə yaratmaq:
let instance = MyClass(value: 10) // Bu çağırış yaddaş ayırmağı və sonra `init` metodunu işə salır
Beləliklə, başlanğıc birbaşa olaraq ayırma və ayırılmış yaddaşın konfiqurasiyası ilə əlaqəlidir.