Capture siyahısında həmişə weak və ya unowned istifadə etmək lazımdırmı?
sobes.tech Süni İntellekt
AI-dan cavab
Xeyr, həmişə deyil.
Retain dövrünü qarşısını almaq üçün Capture List-də weak və ya unowned istifadə edirik.
Retain dövrü, iki və ya daha çox obyektin bir-birinə güclü istinad etdiyi zaman yaranır və yaddaşın sərbəst buraxılmasına imkan vermir.
weak və ya unowned istifadə etmək lazımdır, əgər bağlama güclü istinadla self-ə (və ya başqa bir instansiya dəyişəninə) istinad edirsə və self (və ya başqa obyekt) bu bağlamaya güclü istinadla malikdirsə.
Lazımlı olan vəziyyət nümunələri:
- Asinxron əməliyyatlar (şəbəkə sorğuları, məlumatların emalı)
- Observer nümunəsi
- Animasiya blokları
- Dispatch növbələri
Əgər bağlama self-i (və ya başqa bir güclü istinadla bağlı olan başqa bir dəyişəni) tutmursa və ya struktur tiplərini/enumerasiyaları tutursa, weak və ya unowned istifadə etmək lazım deyil.
weak və unowned arasındakı fərq:
| Növ | Təsviri | Nə zaman istifadə etmək lazımdır |
|---|---|---|
weak |
Zəif (opsional) istinad. nil ola bilər. |
Bağlama obyektin həyat dövrü tutulan obyektin həyat dövründən qısa və ya bərabərdirsə və obyekt nil ola bilərsə, yəni bağlama bitməmişdən əvvəl obyekt nil ola bilər. |
unowned |
Qeyri-əsas (opsional olmayan) istinad. nil ola bilməz. |
Bağlama obyektin həyat dövrü tutulan obyektin həyat dövrü ilə qısadır və ya bərabərdir və əmin olunmalıdır ki, obyekt bağlamadan əvvəl mövcuddur. Əks halda, obyekt bağlamadan əvvəl sərbəst buraxılsa, proqram çökməsinə səbəb olar (deallocated instance üçün unowned istinad). |
weak istifadə nümunəsi:
class MyClass {
var name: String = "Test"
func performAsyncOperation() {
DispatchQueue.global().async { [weak self] in
guard let self = self else {
return
}
print("Əməliyyat tamamlandı: \(self.name)")
}
}
deinit {
print("MyClass sərbəst buraxıldı")
}
}
unowned istifadə nümunəsi:
class ViewController {
var dismissButton: UIButton!
func setupButton() {
dismissButton.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
// Bu nümunədə, `self` (ViewController) daha uzun və ya eyni müddətdə yaşayır.
// Bu, target-action üçün bağlamanın güclü istinadla bağlı olmadığı nümunədir, amma unowned konseptini izah edir.
// Əgər bu bir bağlama olsaydı, məsələn, UIControl.Event handler-də,
// və ViewController mütləq mövcuddursa,:
// dismissButton.addAction(UIAction { [unowned self] _ in
// self.dismiss(animated: true, completion: nil)
// }, for: .touchUpInside)
}
@objc func dismiss() {
// View controller-i bağlama
}
}
Əgər bağlama retain dövrü yaratmırsa, weak və ya unowned istifadə etmək lazım deyil və hətta lazım olmayan yoxlamalara səbəb ola bilər (weak üçün) və ya potensial çökmələrə (unowned üçün).
Məsələn, self və ya başqa bir obyektə güclü istinad edən bağlama:
func fetchData(completion: @escaping (Data) -> Void) {
URLSession.shared.dataTask(with: URL(string: "...")!) { data, response, error in
guard let data = data else { return }
completion(data)
}.resume()
}
Bu halda, [weak self] və ya [unowned self] istifadə etmək lazım deyil.