Веб-версияОткрыть в Telegram

Пост😄ARC, что внутри?

23 декабря 2025
S
Sergio Petrov
Ссылка
нажмите — покажем
😄ARC, что внутри? Казалось бы, тема пройдена вдоль и поперек, однако на технических интервью я периодически встречаю недопонимание принципов работы ARC даже у опытных разработчиков ⚡️Самый важный момент: ARC "живет" только при компиляции Он не отслеживает объекты в рантайме, не решает, когда освобождать память. Его задача - вставить в скомпилированный код вызовы функций, которые при MRC в Objective-C разработчик расставляет самостоятельно: 👉 objc_retain(ptr) - увеличивает счетчик ссылок объекта 👉 objc_release(ptr) - уменьшает счетчик 👉 objc_autorelease(ptr) - отложенное уменьшение счетчика, сегодня редкий кейс, об этом чуть ниже Роль рантайма же - слепое исполнение инструкций. Если счётчик достигает нуля, объект немедленно деаллоцируется: вызывается deinit, освобождаются stored-свойства, память возвращается в кучу. Что до счётчика ссылок - он хранится в заголовке объекта в куче и создаётся при аллокации объекта. Из Swift-кода доступа туда не получить 🤔 Что по autorelease? Используется редко, но стоит упомянуть в контексте autoreleasepool. ARC вставляет autorelease только тогда, когда на этапе компиляции не может точно определить момент окончания владения объектом: 👉 Границы Swift ↔ Objective-C 👉 Объекты с атрибутом @autorelease Важный момент: autorelease не откладывает деаллокацию. Он откладывает выполнение release в конце блока autoreleasepool, итерации runloop'а или при завершении потока Именно поэтому autoreleasepool внутри циклов так важен для управления памятью. Без него множество больших объектов будут накапливаться в пуле до конца итерации runloop'а, вызывая скачок потребления памяти Итоговая модель выглядит так: 1️⃣ Swift-код 2️⃣ ARC на этапе компиляции вставляет вызовы retain/release/autorelease 3️⃣ Рантайм аллоцирует объект с заголовком 4️⃣ Retain → увеличивает счётчик. Autorelease → добавляет объект в пул (счётчик не меняется) 5️⃣ Пул завешается → выполняются release для всех объектов в пуле 6️⃣ Если счётчик == 0 → немедленная деаллокация. 💫 Надеюсь, сегодня мне удалось повысить понимание этого процесса: что решает компилятор, что слепо исполняет рантайм и где ответственность переходит к разработчику 📎 Что почитать? Постарше Посвежее Очень старая дока по ObjC, но многое актуально и для Swift #iOS #Swift #ARC #MemoryManagement #Performance 👏
15 · 295 ·

Рядом в ленте

SSergio Petrov😄Почему мы стараемся минимизировать сторонние зависимости? Интеграция сторонней библиотеки часто кажется спасением: 10 минут вместо нескольких спринтов самостояKKirill Smirnov😒 Claude Code + XcodeBuildMCP + xcodemake. Попытка сделать быстрые инкрементальные билды для AI, рядом с xcodebuild. Как это работает: xcodemake сначала прогоня
это сообщение
KKirill Smirnov😏 Использование семантического версионирования (SemVer) — важный шаг к осознанному выпуску продуктов. SemVer — это не просто набор чисел, а коммуникационный инсKKirill Smirnov🍕 Хочется потихоньку выходить из новогоднего вайба и начинать набирать тонус и жизненный и рабочий. И начать год хочется с первой статьи — и снова про AI-кодинг
YYDC — Pizza Powered iOSYDC — Pizza Powered iOS@YoungDaCode · канал · Технологии
243подписчиков150постов в индексе
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем