Ответ
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:
- 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 не будут деинициализированы - Решение: Разрывать циклы с помощью
weakилиunownedссылок. - Правило: Используйте strong-ссылки для обозначения отношений владения. Для остальных случаев (делегаты, обратные ссылки в иерархии) выбирайте
weakилиunowned.