Как работает Automatic Reference Counter в iOS? На самом деле эту тему мне было легче понять после того, как я познакомился с Manual Reference Counter. Это очень простая статья, которая помогает базово понять как работает управление памятью в iOS.

Для управления памятью в iOS есть несколько инструментов:

MRC - Manual Reference Counter

MRC - это ручное управление ссылками через код. В самом начале и в доисторические времена разработчики сами управляли подсчетом ссылок через команды. Было это, мягко говоря, жестко:

  • alloc - создание объекта (создаем ссылку)

  • retain - обращение к нему (+1 к ссылке)

  • release - уменьшаем счетчик ссылок (-1)

  • dealloc - если счетчик ссылок равен 0 = выгрузка из памяти

По сути, вы выделяете объект, сохраняете его в какой-то момент, а затем отправляете один выпуск для каждого отправленного вами выделения / сохранения. Метод dealloc вызывается для объекта, когда он удаляется из памяти.

Проблемы:

  • Нужно постоянно считать retain, release

  • крэш при обращении из выгруженного из памяти

  • забыли поставить релиз - утечка памяти

ARC - Automatic reference counter

После того, как умные программисты поняли, что можно придумать механизм, который сам за программиста считает ссылки - мир в iOS поменял. Больше не нужно было считать ссылки и следить за ними. За нас это делает ARC автоматически. Он сам понимает куда и зачем что вставлять и когда удалять. Стоит понять, ЧТО ARC РАБОТАЕТ ПРИ КОМПИЛЯЦИИ, А ПОДСЧЕТ ССЫЛОК В РАНТАЙМЕ.

Что изменилось?

  • (release/retain - нельзя вызывать) dealloc - работает частично

  • properties change - weak/strong

У property появились модификаторы:

  • strong - аналог retain

  • weak - аналог assign. в проперти при освобождении ставится нил и не крэшит приложение при обращении

Но есть и минусы, с которыми не справляется ARC:

  • Retain cycle - это когда объем выделенного пространства в памяти не может быть освобожден из-за циклов сохранения. Поскольку Swift использует автоматический подсчет ссылок (ARC), цикл сохранения происходит, когда два или более объекта содержат сильные ссылки друг на друга. В результате эти объекты сохраняют друг друга в памяти, потому что их счетчик сохранения никогда не уменьшится до 0, что предотвратит вызов функции deinit и освобождение памяти

Решение банальное - сделать одну из ссылок слабой.

Из доки мы видим, что:

Автоматический подсчет ссылок (ARC) - это функция компилятора, которая обеспечивает автоматическое управление памятью объектов Objective-C. Вместо того чтобы думать об операциях сохранения и освобождения, ARC позволяет вам сосредоточиться на интересном коде, графах объектов и отношениях между объектами в вашем приложении.

Эта статья является больше базовой и ознакомительной с основами memory management в iOS, для легкого концептуального понимания.