Детектируются в compile time в основном. Это кстати позволяет выкинуть полностью GC когда он не требуется и оставлять рантайм только для ARC
Интересно, ну вот выносить по-максимуму в compile time это самая правильная тема. Мне кажется сборщик мусора следующего поколения должен быть максимально интегрирован с языком и использовать всю информацию статического анализа кода - в каких местах создаются объекты, в каких скоупах этих объекты живут, в каких местах происходит запись ссылок и их скоупы. Вполне возможно за счет этого получится разрулить циклические зависимости и уменьшить расход памяти на подсчет ссылок если известны лайфтаймы объектов и их флоу по коду