Вы можете взять язык, известный как Swift, и переименовать его в «Swift with ARC». Затем вы можете создать новый язык под названием «Swift with GC» с точно таким же синтаксисом, но с меньшим количеством гарантий о том, когда объекты освобождаются.
В Swift с ARC, если счетчик ссылок равен 0, объект будет идти. При сборке мусора, если у вас есть слабая ссылка, вы можете присвоить эту слабую ссылку сильной ссылке, чтобы «восстановить» объект. (В Swift, если число ссылок равно 0, слабые ссылки равны нулю); это серьезная разница.
И, конечно же, Swift с ARC гарантирует, что уничтожение последнего счетчика ссылок немедленно освободит объект. Например, у вас может быть класс FileWriter, в котором вам не разрешено иметь два экземпляра, записывающих в один и тот же файл одновременно. В Swift с ARC вы можете сказать oldWriter = nil; newWriter = FileWriter (...), и вы будете знать, что новый FileWriter создается только после удаления старого (если вы не сохранили другую ссылку); в Swift с GC это не сработает.
Другое отличие состоит в том, что в «Swift with ARC» объекты, на которые ссылаются только через циклы сильных ссылок, но которые на самом деле не достижимы, гарантированно не освобождаются.
deinit
в качестве ключевого слова и связанная с ним семантика действительно являются тем, что делает подсчет ссылок прямо в языке, а не в реализации.