Вы на самом деле не спрашиваете, почему Сборка мусора недоступна на iOS. Скорее, вы спрашиваете , как сборка мусора иногда может быть доступна на языке, а иногда нет.
На одном уровне ответ прост. Apple просто не включила сборщик мусора в среду выполнения для iOS. По сути, на Mac есть код, который реализует сборку мусора. Этот код "отсутствует" на iOS. Сам компилятор, вероятно, несколько отличается, но это просто вопрос наличия кода в компиляторе, который говорит: if(COMPILING_TO_GC)
По сути, Apple делает это, компилируя по-другому и предоставляя другое время выполнения.
На более философском уровне это действительно один и тот же язык? Вы можете утверждать, что Objective-C для iOS - это не тот же язык, что и Objective-C для Mac. Отсутствие сборки мусора в iOS существенно отличает семантику языка. Таким образом, вы можете рассматривать его как два разных языка, которые выглядят очень похожими, но имеют слегка различную семантику.
На практическом уровне различия между языками уменьшены с введением автоматического подсчета ссылок (ARC). Это делает управление памятью автоматически с использованием подсчета ссылок. Эффект заключается в том, что iOS имеет слабую форму сборки мусора. В результате семантика отличается еще большей тонкостью.