Как strong-ссылка влияет на жизненный цикл объекта в ARC (Swift)?

«Как strong-ссылка влияет на жизненный цикл объекта в ARC (Swift)?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Strong-ссылка (сильная) — это ссылка по умолчанию в Swift ARC. Она увеличивает счетчик ссылок (retainCount) объекта на 1, удерживая его в памяти. Объект освобождается (деинициализируется), только когда количество strong-ссылок на него становится равным нулю.

Пример жизненного цикла:

class Person {
    let name: String
    init(name: String) { self.name = name; print("(name) создан") }
    deinit { print("(name) освобожден") }
}

var strongRef1: Person? = Person(name: "Иван") // RetainCount = 1, "Иван создан"
var strongRef2: Person? = strongRef1            // RetainCount = 2

strongRef1 = nil                                // RetainCount = 1
strongRef2 = nil                                // RetainCount = 0 -> "Иван освобожден"

Важные следствия и best practices:

  1. Retain Cycle (Цикл сильных ссылок): Если два объекта имеют strong-ссылки друг на друга, они никогда не освободятся.
    class A { var b: B? }
    class B { var a: A? }
    let a = A(); let b = B()
    a.b = b // A strong ссылается на B
    b.a = a // B strong ссылается на A -> ЦИКЛ!
    // Ни A, ни B не будут деинициализированы
  2. Решение: Разрывать циклы с помощью weak или unowned ссылок.
  3. Правило: Используйте strong-ссылки для обозначения отношений владения. Для остальных случаев (делегаты, обратные ссылки в иерархии) выбирайте weak или unowned.