Вопрос проверяет понимание эволюции ARC и различий в модели памяти между Swift и Objective-C.
И Swift, и Objective-C используют ARC, но в Swift управление памятью более строго типизировано и безопасно. Swift по умолчанию предотвращает многие ошибки, которые были возможны в Objective-C. Также Swift активнее использует value-типы, что меняет характер работы с памятью. В Objective-C больше динамики и меньше проверок на этапе компиляции.
Хотя ARC используется и в Swift, и в Objective-C, модели памяти у этих языков не идентичны.
В обоих языках:
используется ARC
память освобождается при retain count == 0
нет garbage collector’а
Но поверх этой базы Swift добавляет дополнительные гарантии.
В Swift:
strong, weak, unowned — часть языка
ошибки с памятью часто ловятся компилятором
В Objective-C:
больше проверок происходит в runtime
легче получить dangling pointer при ошибке
Swift активно использует:
struct
enum
tuple
Это означает:
меньше heap-аллокаций
меньше работы для ARC
меньше retain cycle по умолчанию
В Swift:
weak всегда optional
автоматическое зануление при деинициализации объекта
В Objective-C:
historically были unsafe варианты
больше риска обращения к освобождённой памяти
Swift:
агрессивно оптимизирует retain/release
может устранять лишние операции
Objective-C:
сильнее зависит от runtime
меньше возможностей для compile-time оптимизаций
При переходе с Objective-C на Swift:
утечек становится меньше
retain cycle чаще возникают из-за логики, а не из-за языка
поведение памяти становится более предсказуемым
Swift делает управление памятью более безопасным и статически проверяемым, сохраняя ARC как основу. Objective-C даёт больше свободы, но и больше возможностей для ошибок.