Как работает 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, для легкого концептуального понимания.
Florelit
Не хватает информации про метод autorelease для полноты картины