← Назад к вопросам

Для чего нужна Strong ссылка?

1.0 Junior🔥 282 комментариев
#Управление памятью

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сильное (Strong) связывание в iOS: фундамент управления памятью

Сильная ссылка (Strong reference) — это тип связи по умолчанию между объектом и его владельцем в ARC (Automatic Reference Counting), системе управления памятью Objective-C и Swift. Её основное предназначение — явно указать, что объект-владелец является ответственным за жизненный цикл ссылаемого объекта. Пока существует хотя бы одна сильная ссылка на объект, он остается в памяти. Когда количество сильных ссылок на объект достигает нуля (т.е. все владельцы отпустили его), ARC автоматически освобождает занимаемую им память.

Как это работает в коде

Рассмотрим на классическом примере отношений между объектами.

class Person {
    let name: String
    var apartment: Apartment? // Сильная ссылка на Apartment
    
    init(name: String) {
        self.name = name
        print("\(name) инициализирован")
    }
    
    deinit {
        print("\(name) деинициализирован")
    }
}

class Apartment {
    let unit: String
    var tenant: Person? // Сильная ссылка на Person
    
    init(unit: String) {
        self.unit = unit
        print("Апартаменты \(unit) инициализированы")
    }
    
    deinit {
        print("Апартаменты \(unit) деинициализированы")
    }
}

При создании и связывании объектов возникает ситуация с сильными ссылками:

var john: Person? = Person(name: "John") // strongRefCount(Person) = 1
var unit4A: Apartment? = Apartment(unit: "4A") // strongRefCount(Apartment) = 1

john!.apartment = unit4A // strongRefCount(Apartment) = 2 (Person владеет Apartment)
unit4A!.tenant = john    // strongRefCount(Person) = 2 (Apartment владеет Person)

В этой ситуации, даже если мы обнулим исходные переменные, объекты не будут освобождены:

john = nil    // strongRefCount(Person) уменьшается с 2 до 1
unit4A = nil  // strongRefCount(Apartment) уменьшается с 2 до 1

// Ни один deinit не вызван! Возник **цикл сильных ссылок** (Strong Reference Cycle)

Ключевые функции сильных ссылок

  • Определение владения: Сильная ссылка декларирует: "Этот объект принадлежит мне, и он должен существовать, пока я существую". Это фундаментальный принцип управления памятью.
  • Предотвращение преждевременного освобождения: Гарантирует, что объект, который всё ещё используется (на который есть "живые" сильные ссылки), не будет неожиданно удалён из памяти, что привело бы к крашу приложения.
  • Явность семантики: В Swift по умолчанию все ссылки являются сильными, что делает поток владения более предсказуемым и явным по сравнению с языками со сборщиком мусора (Garbage Collector).

Проблема и её решение

Как видно из примера выше, главная проблема сильных ссылок — циклы сильных ссылок (Retain Cycles), когда два или более объекта удерживают друг друга сильными ссылками, создавая изолированный граф, недоступный для ARC. Для их разрешения используются:

  1. Слабые ссылки (weak): weak var tenant: Person?
    *   Не увеличивают счётчик ссылок (strongRefCount) объекта.
    *   Автоматически становятся `nil`, когда объект, на который они указывают, освобождается.
    *   Всегда должны быть **optional-переменными (`var`)**.

  1. Бесхозные ссылки (unowned): unowned let tenant: Person
    *   Аналогично `weak`, не увеличивают счётчик ссылок.
    *   **Не становятся `nil`** (предполагается, что время жизни связанного объекта равно или больше времени жизни ссылающегося).
    *   Обращение к `unowned` ссылке после освобождения объекта вызовет **краш**.
    *   Могут быть **non-optional** и объявлены как `let`.

Исправленный вариант с weak:

class Apartment {
    let unit: String
    weak var tenant: Person? // Теперь ссылка СЛАБАЯ

    init(unit: String) { self.unit = unit }
}
// Теперь при john = nil и unit4A = nil оба объекта успешно деинициализируются.

Итог

Таким образом, сильная ссылка — это основной механизм заявления прав владения объектом и контроля его времени жизни в ARC. Её правильное использование обеспечивает стабильность приложения, а понимание её природы является обязательным для предотвращения утечек памяти (memory leaks) через циклы сильных ссылок. Совместное применение сильных, слабых и бесхозных ссылок позволяет строить сложные, безопасные и эффективные объектные графы в iOS- и macOS-приложениях.

Для чего нужна Strong ссылка? | PrepBro