Ответ
По умолчанию все ссылки на экземпляры классов в 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объекту произойдет краш. Используется, когда время жизни объектов связано.