Назад к вопросам
Middle
77
questionbank

Как осуществляется хранение вьюшек, которые являются типом ссылки?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Вьюшки (UIView и его подклассы) в iOS являются классами, а значит, ссылочным типом. Хранение ссылок на них осуществляется с использованием следующих механизмов:

  1. Сильные ссылки (Strong References):

    • По умолчанию, если вы объявляете свойство для UIView без спецификатора weak или unowned, это создаёт сильную ссылку.
    • Сильная ссылка увеличивает счётчик ссылок объекта. Объект не будет удален из памяти до тех пор, пока на него существует хотя бы одна сильная ссылка.
    • Это стандартный способ хранения вьюшек, когда требуется, чтобы они оставались в памяти и были доступны.
    //Strong Reference
    var myView: UIView = UIView()
    
  2. Слабые ссылки (Weak References):

    • Объявляются с использованием ключевого слова weak.
    • Слабая ссылка не увеличивает счётчик ссылок объекта.
    • Слабые ссылки не предотвращают удаление объекта из памяти, если на него не осталось сильных ссылок.
    • Используются для предотвращения циклов сильных ссылок, типичная ситуация — связь родитель-потомок, где родитель имеет сильную ссылку на потомка, а потомок иногда может иметь ссылку на родителя. В этом случае обратная ссылка на родителя должна быть слабой.
    • Слабые ссылки обязательно должны быть опциональными (Optional), так как объект может быть удален, и ссылка станет nil.
    weak var parentView: UIView?
    
  3. Неowning ссылки (Unowned References):

    • Объявляются с использованием ключевого слова unowned.
    • Как и слабые ссылки, не увеличивают счётчик ссылок.
    • Отличие: в отличие от слабых ссылок, неowning ссылки не являются опциональными. Они предполагают, что объект будет жить как минимум до тех пор, пока существует ссылка на него. Краш приложения произойдёт, если попытаться получить доступ к объекту по unowned ссылке после того, как он был освобожден.
    • Используются, когда уверен, что жизненный цикл ссылки не превосходит жизненный цикл объекта, на который она указывает. В контексте вьюшек это менее распространено, чем weak.
    //Менее типично для вьюшек, но возможно
    unowned var childView: UIView
    
  4. Массивы и Коллекции:

    • Хранение ссылок на вьюшки в массивах (Array), словарях (Dictionary) или множествах (Set) также по умолчанию создаёт сильные ссылки на элементы коллекции.
    var subviews: [UIView] = []
    

Выбор между сильной, слабой или неowning ссылкой зависит от конкретного сценария использования и управления жизненным циклом объектов для предотвращения утечек памяти (memory leaks). В SwiftUI концепции управления жизненным циклом вьюшек несколько иные, но в контексте UIKit эти механизмы остаются основным способом хранения ссылок.