Middle
Cum se stochează vizualizările care sunt un tip de referință?
sobes.tech AI
Răspuns de la AI
Vederurile (UIView și subclasele sale) în iOS sunt clase, deci tipuri de referință. Stocarea referințelor către ele se face prin următoarele mecanisme:
-
Referințe puternice (Strong References):
- În mod implicit, dacă declarați o proprietate pentru UIView fără specificatorul
weaksauunowned, se creează o referință puternică. - O referință puternică crește contorul de referințe al obiectului. Obiectul nu va fi șters din memorie atâta timp cât există cel puțin o referință puternică către el.
- Aceasta este metoda standard de stocare a vederilor, atunci când este necesar ca acestea să rămână în memorie și să fie accesibile.
//Referință puternică var myView: UIView = UIView() - În mod implicit, dacă declarați o proprietate pentru UIView fără specificatorul
-
Referințe slabe (Weak References):
- Sunt declarate folosind cuvântul cheie
weak. - O referință slabă nu crește contorul de referințe al obiectului.
- Referințele slabe nu împiedică ștergerea obiectului din memorie dacă nu mai există referințe puternice.
- Sunt folosite pentru a preveni ciclurile de referințe puternice, o situație tipică fiind relația părinte-copil, unde părintele are o referință puternică către copil, iar copilul uneori poate avea o referință către părinte. În acest caz, referința inversă către părinte trebuie să fie slabă.
- Referințele slabe trebuie să fie opționale (
Optional), deoarece obiectul poate fi șters, iar referința va deveninil.
weak var parentView: UIView? - Sunt declarate folosind cuvântul cheie
-
Referințe neposesate (Unowned References):
- Sunt declarate folosind cuvântul cheie
unowned. - La fel ca referințele slabe, nu cresc contorul de referințe.
- Diferență: față de referințele slabe, referințele neposesate nu sunt opționale. Se presupune că obiectul va trăi cel puțin atât timp cât există referința către el. Accesul la obiect după ce a fost eliberat va duce la o eroare (crash).
- Sunt folosite atunci când e sigur că ciclul de viață al referinței nu depășește ciclul de viață al obiectului la care se referă. În contextul vederilor, acest lucru este mai puțin frecvent decât
weak.
//Mai puțin tipic pentru vederi, dar posibil unowned var childView: UIView - Sunt declarate folosind cuvântul cheie
-
Array-uri și Colecții:
- Stocarea referințelor la vederi în array-uri (
Array), dicționare (Dictionary) sau seturi (Set) creează, de asemenea, în mod implicit, referințe puternice la elementele colecției.
var subviews: [UIView] = [] - Stocarea referințelor la vederi în array-uri (
Alegerea între referință puternică, slabă sau neposesată depinde de scenariul specific de utilizare și de gestionarea ciclului de viață al obiectelor pentru a preveni scurgerile de memorie. În SwiftUI, conceptele de gestionare a ciclului de viață al vederilor sunt diferite, dar în contextul UIKit, aceste mecanisme rămân principalul mod de stocare a referințelor.