Sobes.tech
Middle

Sınıf başlatma, bellek tahsisi ile nasıl ilişkilidir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bir sınıfın (nesnenin) örneği oluşturulduğunda, sistem onun özellikleri ve meta verilerini depolamak için bir bellek bloğu ayırır. (init) yapıcı, bu bellek bloğunu ayırdıktan sonra ve tamamen başlatılmış nesne geri döndürülmeden önce yapılandırmak için çağrılan özel bir yöntemdir.

İşlem şunları içerir:

  1. Bellek ayırma: İşletim sistemi (Swift/Objective-C çalışma ortamı aracılığıyla) yığın (heap) üzerinde gerekli bellek miktarını ayırır. Boyut, sınıfın tipi, özelliklerin sayısı ve türüne bağlıdır.
  2. Özelliklerin başlatılması: Yapıcı, örneğin tüm saklanan özelliklerin başlangıç değerleri almasını sağlar. Bu çok önemlidir çünkü başlatılmamış özellikler belirsiz duruma ve çalışma zamanı hatalarına yol açabilir.
  3. init çağrısı: Sınıfın ilgili yapıcı yöntemi çağrılır, nesnenin durumu için gerekli mantık yürütülür. Bu, özelliklere değer atama, diğer yöntemleri çağırma veya başka herhangi bir başlatma işlemi içerebilir.
  4. Nesnenin geri döndürülmesi: Başarılı bir yapıcı çalıştırmasından sonra, çalışma zamanı ortamı yeni oluşturulmuş ve başlatılmış nesneye bir gösterici döndürür.

Swift'te güvenliği sağlayan başlatma kuralları vardır:

  • Tüm örnek saklanan özellikler, sınıfın yapıcı çalışmasını tamamladığında başlangıç değerine sahip olmalıdır.
  • Bir özelliğe değer atanmadan önce, belleği ayırılmış olmalıdır.
  • Alt sınıfın yapıcı, ana sınıfın yapıcısını çağırmadan önce kendi özelliklerini başlatmalıdır (iki aşamalı başlatma).

Başlatma ve bellek arasındaki ilişki örneği:

class MyClass {
    let myProperty: Int // Başlatılması gereken saklanan özellik

    init(value: Int) {
        self.myProperty = value // Özelliği başlatır, onun için bellek artık ayarlanmıştır
        // 'myProperty' için bellek, MyClass örneği oluşturulduğunda ayırılmıştır,
        // ancak değeri burada yapıcıda ayarlanır.
    }

    // Açık bir yapıcı sağlanmazsa, Swift varsayılan bir tane sağlayabilir
    // tüm özellikler varsayılan değerlere sahipse veya opsiyonel ise.
    // Bu durumda, 'myProperty' varsayılan bir değere sahip değildir,
    // bu yüzden onu ayarlamak için bir yapıcı gereklidir.
}

// Bir örnek oluşturma:
let instance = MyClass(value: 10) // Bu çağrı bellek ayırmayı tetikler ve ardından init metodunu çağırır

Dolayısıyla, başlatma doğrudan belirli bir sınıf örneği için ayırılan belleğin ayırılması ve yapılandırılmasıyla ilişkilidir.