Middle
Projelerinizde bellek sızıntılarını nasıl önliyorsunuz?
sobes.tech yapay zeka
AI'dan gelen yanıt
Birden fazla yaklaşım kullanıyorum:
- ARC (Otomatik Referans Sayımı): Swift ve Objective-C'de bellek yönetiminin ana mekanizmasıdır. Nesnelere referansları otomatik olarak sayar ve referans sayısı sıfıra ulaşınca serbest bırakır.
- Güçlü referans döngülerinden kaçınma: Bu, en yaygın bellek sızıntısı nedenidir. Döngüleri kırmak için
weakveyaunownedreferanslar kullanıyorum. Bu genellikle delegeler ve kapanışlar ile çalışırken olur. - Profil araçları: Xcode'dan Instruments (Allocator, Leaks) gibi araçları düzenli kullanıyorum, sızıntıları tespit etmek için.
- Kapanışların kontrolü: Özellikle
self'in yakalanması sırasında[weak self]veya[unowned self]yakalama listeleri kullanarak dikkatlice inceliyorum. - Bildirimlerden çıkış: Nesneleri yok ederken
NotificationCenterve KVO gözlemcilerinden çıkış yapıyorum. - Gözlemcileri ve zamanlayıcıları kaldırma: Artık ihtiyaç duyulmadıklarında zamanlayıcıları devre dışı bırakıp null yapıyorum ve gözlemcileri kaldırıyorum.
- Kaynakların yönetimi: Dosyalar, soketler ve veritabanları gibi kaynakları doğru şekilde yönetiyor, zamanında kapatıp serbest bırakıyorum.
- Kod incelemeleri: Düzenli olarak kod incelemeleri yapıyorum, potansiyel bellek yönetimi sorunlarını tespit etmek için.
[weak self] kullanımı örneği:
class DataFetcher {
var completionHandler: (() -> Void)?
func fetchData() {
// Güçlü döngüyü önlemek için weak self kullanımı
DispatchQueue.global().async { [weak self] in
// Veri alma simülasyonu
sleep(1)
DispatchQueue.main.async {
// self kullanmadan önce nil kontrolü
self?.completionHandler?()
}
}
}
}
class ViewController {
var fetcher: DataFetcher?
func setupFetcher() {
fetcher = DataFetcher()
fetcher?.completionHandler = {
// Burada, fetcher hala varsa, self zayıf olabilir
print("Veri alındı ViewController'da")
}
}
deinit {
print("ViewController yok edildi")
}
}
weak kullanımı örneği, delegate için:
protocol DataProcessorDelegate: AnyObject { // AnyObject referans tipi sağlar ve güçlü döngüleri önler
func processData(_ data: String)
}
class DataProcessor {
weak var delegate: DataProcessorDelegate? // weak kullanımı
func process(_ data: String) {
delegate?.processData(data)
}
}
class AnotherViewController: DataProcessorDelegate {
let processor = DataProcessor()
init() {
processor.delegate = self
}
func processData(_ data: String) {
print("Veri işleniyor: \(data)")
}
deinit {
print("AnotherViewController yok edildi")
}
}