Saklama döngüleri ve weak/unowned ile kırma
Nesneler ile closure'lar arasındaki saklama döngülerini fark edin ve bunları weak ile unowned başvurularını güvenle kullanarak kırın.
Saklama döngüleri ve weak/unowned ile kırma, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 3 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 3 dersten oluşur.
Tutma döngüsü nedir?
Bir tutma döngüsü, nesneler (veya kapanışlar) birbirlerine strong referanslarla bağlı kaldığında ve ARC hiçbir zaman sıfıra ulaşamadığında oluşur. Döngüleri weak veya unowned ile kırınız.
Nesne ↔ nesne döngüsü
İki yöndeki strong referanslar bir sızıntı oluşturur: nesnelerin hiçbiri sıfıra düşemez.
final class Owner {
var gadget: Gadget?
deinit { print("Owner deinit") }
}
final class Gadget {
var owner: Owner?
deinit { print("Gadget deinit") }
}
// Strong ⇄ strong (cycle)
var o: Owner? = Owner()
var g: Gadget? = Gadget()
o!.gadget = g
g!.owner = o
o = nil // no deinit
g = nil // still no deinit (leak)weak ile kırma
ARC'nin her ikisini de serbest bırakabilmesi için taraflardan birini weak yapınız (genellikle temsilci veya owner gibi geri referansı).
final class Owner2 {
var gadget: Gadget2?
deinit { print("Owner2 deinit") }
}
final class Gadget2 {
weak var owner: Owner2? // weak breaks cycle; becomes nil automatically
deinit { print("Gadget2 deinit") }
}
var o2: Owner2? = Owner2()
var g2: Gadget2? = Gadget2()
o2!.gadget = g2
g2!.owner = o2
o2 = nil // Owner2 deinit
g2 = nil // Gadget2 deinitKapanış döngüsü (strong self)
Kapanışlar, değişkenleri varsayılan olarak strong biçimde yakalar. Nesne kapanışın da sahibiyse bir döngü oluşur.
final class TimerClient {
var tick: (() -> Void)?
deinit { print("TimerClient deinit") }
func start() {
// BAD: closure strongly captures self; self keeps tick strongly
tick = {
print("tick from", self) // strong capture of self
}
}
}
var c: TimerClient? = TimerClient()
c!.start()
c = nil // no deinit — closure holds self stronglyYakalama listeleriyle kırma
Güvenli temizlik için (seçimli) [weak self] kullanınız; [unowned self] seçeneğini yalnızca kapanış çalıştığında self'in kesinlikle hayatta olacağını biliyorsanız kullanınız.
final class TimerClient2 {
var tick: (() -> Void)?
deinit { print("TimerClient2 deinit") }
func start() {
// Use [weak self] when self can go away before tick runs
tick = { [weak self] in
guard let self = self else { return } // safe unwrap
print("tick from", self)
}
// Alternative when lifetime is guaranteed: [unowned self]
// tick = { [unowned self] in print("tick from", self) }
}
}
var c2: TimerClient2? = TimerClient2()
c2!.start()
c2 = nil // deinit now prints — no cycleDenetim listesi
Denetim listesi:
- İki yönlü referanslar mı var? Taraflardan birini weak yapınız (örneğin temsilciyi).
- Kapanışlar bir tür üzerinde mi depolanıyor? [weak self] ile yakalayınız ve güvenli biçimde açınız.
- [unowned self] seçeneğini yalnızca yaşam süresi garanti edildiğinde kullanınız; aksi takdirde çökmeye neden olabilir.
Kapanışlarda weak ve unowned
Kısa kontrol: Nesne serbest bırakılabilecekse hangi yakalama listesi daha güvenlidir?
Özet
Özet: Nesnelerde ve kapanışlarda döngüleri belirleyiniz. Bunları uygun şekilde weak veya unowned ile kırınız; kararsız kaldığınızda weak seçeneğini tercih ediniz.
Sıkça Sorulan Sorular
“Saklama döngüleri ve weak/unowned ile kırma” dersi ücretsiz mi?
Evet — “Saklama döngüleri ve weak/unowned ile kırma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 3 dersten oluşur.
“Saklama döngüleri ve weak/unowned ile kırma” dersinde ne öğreneceğim?
Nesneler ile closure'lar arasındaki saklama döngülerini fark edin ve bunları weak ile unowned başvurularını güvenle kullanarak kırın. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Swift Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 2. dersidir.
“Saklama döngüleri ve weak/unowned ile kırma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- ARC temelleri: strong / weak / unowned
- Saklama döngüleri ve weak/unowned ile kırma
- Paylaşımı azaltmak için değer türleri