Sobes.tech
Middle

Kā tiek glabāti skati, kas ir atsauces tips?

sobes.tech AI

Atbilde no AI

Skatījumi (UIView un tā apakšklases) iOS ir klases, tātad atsauces tipi. To saglabāšana tiek veikta ar šādiem mehānismiem:

  1. Spēcīgas atsauces (Strong References):

    • Pēc noklusējuma, ja deklarējat īpašību priekš UIView bez weak vai unowned norādījuma, tas izveido spēcīgu atsauci.
    • Spēcīga atsauce palielina objekta atsauces skaitītāju. Objekts netiks dzēsts no atmiņas, kamēr ir vismaz viena spēcīga atsauce.
    • Šis ir standarta veids, kā saglabāt skatus, ja nepieciešams, lai tie paliktu atmiņā un būtu pieejami.
    //Spēcīga atsauce
    var myView: UIView = UIView()
    
  2. Vājās atsauces (Weak References):

    • Deklarē ar atslēgvārdu weak.
    • Vāja atsauce ne palielina objekta atsauces skaitītāju.
    • Vājās atsauces ne novērš objekta dzēšanu no atmiņas, ja nav citu spēcīgu atsauču.
    • Tiek izmantotas, lai novērstu spēcīgu atsauču ciklus, tipiska situācija ir vecāka-mazulis attiecības, kur vecāks ir ar spēcīgu atsauci uz bērnu, un bērns dažreiz var būt ar atsauci uz vecāku. Šajā gadījumā atpakaļsaite uz vecāku ir jābūt vājam.
    • Vājās atsauces ir opcionales (Optional), jo objekts var tikt dzēsts, un atsauce kļūs par nil.
    weak var parentView: UIView?
    
  3. Nepiederīgas atsauces (Unowned References):

    • Deklarē ar atslēgvārdu unowned.
    • Tāpat kā vājās atsauces, tās ne palielina atsauces skaitītāju.
    • Atšķirība: pretstatā vājam, ne piederīgajām atsaucēm nav opcionalas. Tās pieņem, ka objekts dzīvos vismaz tik ilgi, cik pastāv atsauce uz to. Ja mēģināsiet piekļūt objektam caur unowned atsauci pēc tā atbrīvošanas, programma sabruks.
    • Tiek izmantotas, kad esat pārliecināts, ka atsauces dzīves cikls nepārsniegs objekta dzīves ciklu, uz kuru tā norāda. UIKit kontekstā tas ir mazāk izplatīts nekā weak.
    //Mazāk izplatīts skatiem, bet iespējams
    unowned var childView: UIView
    
  4. Masīvi un kolekcijas:

    • Saglabājot atsauces uz skatiem masīvos (Array), vārdnīcās (Dictionary) vai kopās (Set), arī pēc noklusējuma tiek veidotas spēcīgas atsauces uz elementiem.
    var subviews: [UIView] = []
    

Izvēle starp spēcīgu, vājo vai ne piederīgu atsauci ir atkarīga no konkrētā lietošanas scenārija un objektu dzīves cikla pārvaldības, lai novērstu atmiņas noplūdes. SwiftUI kontekstā dzīves cikla pārvaldības koncepcijas ir nedaudz atšķirīgas, bet šie mehānismi paliek galvenais veids, kā saglabāt atsauces.