Middle
Swift'te hangi tür bağlantılar vardır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Swift'te sınıf örneklerine referansların üç temel türü vardır:
-
Güçlü Referans (Strong Reference):
- Varsayılan referans türüdür.
- Güçlü referans, nesnenin referans sayacını artırır.
- Nesne, en az bir güçlü referans kaldığı sürece bellekten serbest bırakılmaz.
- Güçlü referans döngüleri (
strong reference cycles) nedeniyle bellek sızıntılarının ana nedenidir.
class Person { let name: String init(name: String) { self.name = name } deinit { print("\(name) yok ediliyor") } } var reference1: Person? = Person(name: "John") // reference1 artık güçlü referans, Person'ın referans sayacı artar -
Zayıf Referans (Weak Reference):
weakanahtar kelimesi kullanılarak bildirilir.- Zayıf referans, nesnenin referans sayacını artırmaz.
strong reference cyclesönlemek için kullanılır.- Her zaman opsiyoneldir (
Optional), çünkü zayıf referans gösterdiği nesne herhangi bir zamanda yok edilebilir. Nesne yok edildiğinde, zayıf referans otomatik olaraknilolur.
class Apartment { let unit: String weak var tenant: Person? // Zayıf referans init(unit: String) { self.unit = unit } deinit { print("Daire \(unit) yok ediliyor") } } var john: Person? = Person(name: "John") var unit4A: Apartment? = Apartment(unit: "4A") john?.apartment = unit4A // Eğer Apartment, Person'a güçlü referans olsaydı unit4A?.tenant = john // Zayıf referans // Güçlü referanslar kaldırıldıktan sonra nesneler yok edilir john = nil unit4A = nil // Çıktı: "John yok ediliyor", "Daire 4A yok ediliyor" // Eğer tenant güçlü referans olsaydı, bellek sızıntısı (döngü) olurdu -
İlgisiz Referans (Unowned Reference):
unownedanahtar kelimesi kullanılarak bildirilir.weakreferansa benzer şekilde, nesnenin referans sayacını artırmaz.- Ayrıca
strong reference cyclesönlemek için kullanılır. weak'ten farkı, opsiyonel değildir (Optional) ve referansın gösterdiği nesnenin, referansın yaşam süresi boyunca var olacağı varsayılır.unownedreferans gösterdiği nesne yok edilirse ve erişilmeye çalışılırsa, çalışma zamanı hatası (runtime error) oluşur.- Bir nesne her zaman var olursa ve başka bir nesne onunla ilişkili ise, örneğin "ebeveyn-çocuk" durumu gibi, ebeveyn çocuğu sahiplenir ama çocuk ebeveyni güçlü şekilde sahiplenmez.
class Customer { let name: String var card: CreditCard? init(name: String) { self.name = name } deinit { print("\(name) yok ediliyor") } } class CreditCard { let number: Int unowned let customer: Customer // İlgisiz referans init(number: Int, customer: Customer) { self.number = number self.customer = customer // init sırasında güvenli atama } deinit { print("Kart #\(number) yok ediliyor") } } var john: Customer? = Customer(name: "John Doe") john?.card = CreditCard(number: 1234_5678_9012_3456, customer: john!) // Güçlü referans kaldırılıyor john = nil // Çıktı: "John Doe yok ediliyor", "Kart #1234567890123456 yok ediliyor" // CreditCard'daki ilgisiz referans, customer var olduğu sürece geçerlidir. // Eğer CreditCard, Customer'dan daha uzun yaşarsa ve customer'a ilgisiz referansla erişilmeye çalışılırsa, hata oluşur.
weak ve unowned arasındaki temel fark:
weak: nesnenilolabilir. Nesnelerin yaşam süresi birbirine sıkı sıkıya bağlı değilse kullanılır (biri diğer olmadan da var olabilir).unowned: nesnenilolamaz, ve en azından referansın yaşam süresi boyunca var olacağına güvenilir. Kullanılır, nesne en azından referansın yaşam süresi boyunca var olacaksa.