В Swift программист отвечает за нарушение петель между объектами?

Как я понимаю, Swift использует автоматический подсчет ссылок для сбора мусора.

Это возвращает меня на многие годы, когда я был программистом COM.

VB6 (и раньше) автоматизировал процесс децинирования счетчика ссылок, когда объект вышел из сферы действия, большую часть времени это было достаточно, чтобы программист мог забыть об управлении памятью.

Однако, если между объектами были петли,.e.g

Car->WheelsCollection contains pointers to wheels
Wheel->CurrentCar constrains a pointer to the car the wheel is currently installed on

Тогда, когда экземпляр автомобиля вышел из сферы действия, это не будет сбор мусора, поскольку автомобиль сохранил свои колеса в живых, а колеса сохранили автомобиль в живых.

Какие шаблоны программистов или иным образом используются в Swift для предотвращения или устранения этой проблемы?

Ответ 1

Это простой цикл сохранения, вы должны решить его, используя слабую ссылку.

Предполагая это как ваши текущие классы.

class Car {
  var wheel: Wheel?
}

class Wheel {
  var currentCar: Car?
}

и вашей текущей ситуации

var myCar: Car? = Car()
var myWheel: Wheel? = Wheel()

myCar!.wheel = myWheel

Чтобы решить эту проблему, вы должны объявить одну из них как weak, например: weak var currentCar: Car?.

Официальная документация Swift объясняет это здесь.