Middle
Jak przechowywane są widoki, które są typem odwołania?
sobes.tech AI
Odpowiedź od AI
Widoki (UIView i jego podklasy) w iOS są klasami, czyli typami referencyjnymi. Przechowywanie odwołań do nich odbywa się za pomocą następujących mechanizmów:
-
Silne odwołania (Strong References):
- Domyślnie, jeśli zadeklarujesz właściwość dla UIView bez specyfikatora
weaklubunowned, tworzy to silne odwołanie. - Silne odwołanie zwiększa licznik odwołań obiektu. Obiekt nie zostanie usunięty z pamięci, dopóki istnieje co najmniej jedno silne odwołanie do niego.
- To jest standardowy sposób przechowywania widoków, gdy konieczne jest, aby pozostały w pamięci i były dostępne.
//Silne odwołanie var myView: UIView = UIView() - Domyślnie, jeśli zadeklarujesz właściwość dla UIView bez specyfikatora
-
Słabe odwołania (Weak References):
- Deklaruje się je za pomocą słowa kluczowego
weak. - Słabe odwołanie nie zwiększa licznika odwołań obiektu.
- Słabe odwołania nie zapobiegają usunięciu obiektu z pamięci, jeśli nie ma silnych odwołań.
- Używa się ich do zapobiegania cyklom silnych odwołań, typowa sytuacja to relacja rodzic-dziecko, gdzie rodzic ma silne odwołanie do dziecka, a dziecko czasami może mieć odwołanie do rodzica. W takim przypadku odwołanie zwrotne do rodzica powinno być słabe.
- Słabe odwołania muszą być opcjonalne (
Optional), ponieważ obiekt może zostać usunięty, a odwołanie stanie sięnil.
weak var parentView: UIView? - Deklaruje się je za pomocą słowa kluczowego
-
Nieposiadające odwołania (Unowned References):
- Deklaruje się je za pomocą słowa kluczowego
unowned. - Podobnie jak słabe odwołania, nie zwiększają licznika odwołań.
- Różnica: w przeciwieństwie do słabych odwołań, nieposiadające odwołania nie są opcjonalne. Zakłada się, że obiekt będzie żył co najmniej tak długo, jak istnieje odwołanie do niego. Dostęp do obiektu po jego zwolnieniu spowoduje awarię (crash).
- Używa się ich, gdy jest pewność, że cykl życia odwołania nie przekracza cyklu życia obiektu, na który wskazuje. W kontekście widoków jest to mniej powszechne niż
weak.
//Mniej typowe dla widoków, ale możliwe unowned var childView: UIView - Deklaruje się je za pomocą słowa kluczowego
-
Tablice i Kolekcje:
- Przechowywanie odwołań do widoków w tablicach (
Array), słownikach (Dictionary) lub zbiorach (Set) również domyślnie tworzy silne odwołania do elementów kolekcji.
var subviews: [UIView] = [] - Przechowywanie odwołań do widoków w tablicach (
Wybór między silnym, słabym lub nieposiadającym odwołaniem zależy od konkretnego scenariusza użycia i zarządzania cyklem życia obiektów, aby zapobiec wyciekom pamięci. W SwiftUI koncepcje zarządzania cyklem życia widoków są nieco inne, ale w kontekście UIKit te mechanizmy pozostają głównym sposobem przechowywania odwołań.