Как работает 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 и освобождение памяти
Решение банальное — сделать одну из ссылок слабой.
Эта статья является больше базовой и ознакомительной с основами memory management в iOS, для легкого концептуального понимания.
ссылка на оригинал статьи https://habr.com/ru/post/536192/
Добавить комментарий