[Разработка под iOS, Objective C, Swift] Memory Management: ARC vs MRC в iOS

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
05-Янв-2021 18:31

Как работает Automatic Reference Counter в iOS? На самом деле эту тему мне было легче понять после того, как я познакомился с Manual Reference Counter. Это очень простая статья, которая помогает базово понять как работает управление памятью в iOS.Для управления памятью в iOS есть несколько инструментов:MRC - Manual Reference CounterMRC - это ручное управление ссылками через код. В самом начале и в доисторические времена разработчики сами управляли подсчетом ссылок через команды. Было это, мягко говоря, жестко:
  • 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, для легкого концептуального понимания.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_razrabotka_pod_ios (Разработка под iOS), #_objective_c, #_swift, #_swift, #_arc, #_memory, #_razrabotka_pod_ios (
Разработка под iOS
)
, #_objective_c, #_swift
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 23-Ноя 04:58
Часовой пояс: UTC + 5