Gözlemcileri Güvenle Kaldırma
Eski gözlemcilerden kaynaklanan sızıntıları ve çökmeleri önleyin.
Gözlemcileri Güvenle Kaldırma, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 3. 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 4 dersten oluşur.
Gözlemcileri Güvenle Kaldırma
Gözlemciler artık gerekmediğinde kaldırılmalıdır. Başıboş bir gözlemci, sahibi ortadan kalktıktan sonra çalışabilir ve hatalara veya eski API'lerde çökmelere neden olabilir.
Kaldırma Neden Önemlidir
Seçici tabanlı gözlemcilerin, bellekten kaldırılmış bir nesneye ileti gönderilmesini önlemek için geçmişte deinit içinde kaldırılması gerekiyordu.
import Foundation
class Watcher: NSObject {
override init() { super.init() }
deinit { NotificationCenter.default.removeObserver(self) }
}
print("Removes itself on deinit")removeObserver(self)
removeObserver(self) çağrısı, o nesne tarafından oluşturulan tüm gözlemleri tek bir çağrıyla kayıt dışı bırakır.
import Foundation
class VM: NSObject {
func stop() { NotificationCenter.default.removeObserver(self) }
}
VM().stop()
print("Removed all observations for self")Belirli Bir name'i Kaldırma
name ve object bilgilerini geçirerek yalnızca tek bir gözlemi kaldırabilir, diğerlerini olduğu gibi bırakabilirsiniz.
import Foundation
let center = NotificationCenter.default
let obj = NSObject()
let name = Notification.Name("ping")
center.removeObserver(obj, name: name, object: nil)
print("Removed a specific observation")Token Tabanlı Gözlemciler
Kapanış tabanlı addObserver, opak bir token döndürür. Bunu saklayın ve gözlemciyi bu token ile kaldırın.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("ping")
let token = center.addObserver(forName: name, object: nil, queue: nil) { _ in }
center.removeObserver(token)
print("Removed via token")Token'ı Saklama
Token'ı bir özellikte saklayın; böylece gözlemi istediğiniz süre boyunca yaşatabilir ve işiniz bittiğinde kaldırabilirsiniz.
import Foundation
class Model {
var token: NSObjectProtocol?
func start() {
token = NotificationCenter.default.addObserver(
forName: Notification.Name("x"), object: nil, queue: nil) { _ in }
}
func stop() {
if let t = token { NotificationCenter.default.removeObserver(t) }
}
}
let m = Model(); m.start(); m.stop()
print("Lifecycle managed")deinit ile Otomatik Temizleme
Gözlemin sahibi bellekten kaldırıldığında sona ermesi için token'ı deinit içinde kaldırın.
import Foundation
class Owner {
var token: NSObjectProtocol?
deinit { if let t = token { NotificationCenter.default.removeObserver(t) } }
}
print("Token removed on deinit")Modern Yaşam Süresi Notu
Güncel çalışma zamanlarında, blok API'siyle eklenen gözlemciler token bellekten kaldırıldığında otomatik olarak kaldırılır; ancak açıkça kaldırmak yine de güvenli ve anlaşılır bir seçimdir.
import Foundation
// Holding the token in a property controls its lifetime.
class C { var token: NSObjectProtocol? }
print("Token lifetime equals observation lifetime")Güçlü Referans Döngülerinden Kaçınma
Bir kapanış gözlemcisi self öğesini güçlü biçimde yakalarsa, bellekten kaldırılmayı engelleyen bir güçlü referans döngüsünden kaçınmak için [weak self] kullanın.
import Foundation
class VM {
var token: NSObjectProtocol?
func start() {
token = NotificationCenter.default.addObserver(
forName: Notification.Name("x"), object: nil, queue: nil) { [weak self] _ in
self?.handle()
}
}
func handle() { print("handled") }
}
VM().start()İki Kez Kaldırmak Güvenlidir
Zaten kaldırılmış bir gözlemciyi yeniden kaldırmak zararsızdır; bu nedenle koruyucu temizleme çökmeye neden olmaz.
import Foundation
let center = NotificationCenter.default
let obj = NSObject()
center.removeObserver(obj)
center.removeObserver(obj) // no harm
print("Safe to remove twice")En İyi Uygulama Özeti
Token tabanlı kapanışları tercih edin, token'ı saklayın, deinit içinde kaldırın ve self öğesini zayıf biçimde yakalayın. Böylece gözlem yaşam süreleri doğru yönetilir.
import Foundation
class Best {
var token: NSObjectProtocol?
deinit { token.map { NotificationCenter.default.removeObserver($0) } }
}
print("Followed best practices")Kısa Kontrol
addObserver(forName:...) ile eklenen kapanış tabanlı bir gözlemciyi nasıl kaldırırsınız?
Özet
Artık ihtiyaç duymadığınız gözlemcileri her zaman kaldırın. Seçici gözlemcileri kaldırmak için removeObserver(self), kapanış gözlemcileri için döndürülen token öğesini kullanın; token'ı saklayın, temizlemeyi deinit içinde yapın ve self öğesini zayıf biçimde yakalayın. Sıradaki konu: gözlemci deseninin alternatiflerle karşılaştırılması.
Sıkça Sorulan Sorular
“Gözlemcileri Güvenle Kaldırma” dersi ücretsiz mi?
Evet — “Gözlemcileri Güvenle Kaldı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 4 dersten oluşur.
“Gözlemcileri Güvenle Kaldırma” dersinde ne öğreneceğim?
Eski gözlemcilerden kaynaklanan sızıntıları ve çökmeleri önleyin. 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, 4 dersinin 3. dersidir.
“Gözlemcileri Güvenle Kaldı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
- Bildirim Gönderme ve Gözlemleme
- Bildirim userInfo Yükleri
- Gözlemcileri Güvenle Kaldırma
- Gözlemci Desenine Alternatifler