Какой тип ссылки на объект используется по умолчанию в Swift?

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

Ответ

По умолчанию все ссылки на экземпляры классов в Swift являются сильными (strong).

Что это значит: Сильная ссылка увеличивает счетчик ссылок (ARC) объекта. Пока существует хотя бы одна сильная ссылка, объект не освобождается из памяти.

Пример и проблема:

class Person {
    var apartment: Apartment?
}
class Apartment {
    var tenant: Person? // Сильная ссылка по умолчанию
}

var john: Person? = Person()
var unit4A: Apartment? = Apartment()

john!.apartment = unit4A
unit4A!.tenant = john // Цикл сильных ссылок! Ни john, ни unit4A никогда не освободятся.

john = nil
unit4A = nil // Память не освобождается из-за retain cycle.

Решение: Для разрыва циклов удержания используются:

  • weak (слабая ссылка): Не увеличивает счетчик ссылок. Автоматически становится nil при освобождении объекта. Используется, когда ссылка может пережить объект.
  • unowned (невладеющая ссылка): Предполагает, что объект существует на протяжении всей жизни ссылки. Не становится nil. При обращении к освобожденному unowned объекту произойдет краш. Используется, когда время жизни объектов связано.