Middle
Layihələrinizdə yaddaş sızıntılarını necə qarşısını alırsınız?
sobes.tech Süni İntellekt
AI-dan cavab
Mən müxtəlif yanaşmalardan istifadə edirəm:
- ARC (Avtomatik Referans Sayımı): Bu, Swift və Objective-C-də əsas yaddaş idarəetmə mexanizmidir. O, obyektlərə olan referansları avtomatik sayır və referans sayı sıfıra çatanda onları azad edir.
- Güclü referans döngələrindən qaçınma: Bu, ən çox rast gəlinən yaddaş sızmalarının səbəbidir. Mən
weakvə yaunownedreferanslardan istifadə edirəm, döngələri qırmaq üçün. Bu, adətən delegatlar və closure-lərlə işləyərkən baş verir. - Profil alətləri: Mən Xcode-dan Instruments (Allocator, Leaks) kimi alətləri müntəzəm istifadə edirəm, sızmaları aşkar etmək üçün.
- Closure-lərin yoxlanması: Closure-ləri diqqətlə yoxlayıram, xüsusən
self-in tutulması zamanı,[weak self]və ya[unowned self]capture siyahıları istifadə edərək. - Bildirişlərdən çıxış: Mən
NotificationCentervə KVO müşahidəçilərindən obyekti məhv edərkən çıxıram. - Müşahidəçiləri və timer-ləri silmək: Mən invalid edilmiş timer-ləri deaktiv edir və null edir, və artıq lazım olmayan müşahidəçiləri silirəm.
- Resursların idarə olunması: Mən fayllar, socketlər və verilənlər bazası kimi resursları düzgün idarə edirəm, onları vaxtında bağlayıb azad edirəm.
- Kodların nəzərdən keçirilməsi: Mən müntəzəm olaraq kod nəzərdən keçirirəm, hətta yaddaş idarəetməsi ilə bağlı potensial problemləri aşkar etmək üçün.
[weak self] istifadə nümunəsi:
class DataFetcher {
var completionHandler: (() -> Void)?
func fetchData() {
// Güclü döngünü önləmək üçün weak self istifadə edirəm
DispatchQueue.global().async { [weak self] in
// Məlumatların alınmasının simulasyonu
sleep(1)
DispatchQueue.main.async {
// `self`-in nil olub olmadığını yoxlayıram
self?.completionHandler?()
}
}
}
}
class ViewController {
var fetcher: DataFetcher?
func setupFetcher() {
fetcher = DataFetcher()
fetcher?.completionHandler = {
// Burada, əgər fetcher hələ mövcuddursa, self zəif ola bilər
print("ViewController-də məlumatlar alındı")
}
}
deinit {
print("ViewController deaktiv edildi")
}
}
weak-in delegat üçün istifadəsi nümunəsi:
protocol DataProcessorDelegate: AnyObject { // AnyObject referens tipini təmin edir və güclü döngələri qarşısını alır
func processData(_ data: String)
}
class DataProcessor {
weak var delegate: DataProcessorDelegate? // weak istifadə olunur
func process(_ data: String) {
delegate?.processData(data)
}
}
class AnotherViewController: DataProcessorDelegate {
let processor = DataProcessor()
init() {
processor.delegate = self
}
func processData(_ data: String) {
print("Verilənlərin işlənməsi: \(data)")
}
deinit {
print("AnotherViewController deaktiv edildi")
}
}