TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.65K subscribers
Post #385 1.1K
🔢 ARC: компилятор против рантайма, кто что делает на самом деле.

Управление памятью в Swift - одна из тех тем, которую все проходят, но немногие действительно понимают. Особенно это касается Automatic Reference Counting (ARC). Мы привыкли думать о нем как о волшебном сборщике мусора, который где-то там, в недрах системы, следит за нашими объектами. Но реальность намного интереснее и прозаичнее. ARC - это не рантайм-система, а компиляторная технология, и именно в этом кроется большинство недоразумений.


Компилятор как главный архитектор памяти:

Представьте себе архитектора, который проектирует дом. Он не строит его сам, для этого есть строители. Но он создает детальные чертежи, где каждая балка, каждая электрическая цепь, каждая труба имеет свое место. ARC в Swift - именно такой архитектор. Когда вы пишете:

class User {
let name: String
init(name: String) { self.name = name }
}

func createUser() {
let user = User(name: "Алексей")
// что-то делаем с user
}


ARC на этапе компиляции анализирует этот код и вставляет инструкции управления памятью. Грубо говоря, после компиляции код выглядит примерно так (в псевдокоде):

func createUser() {
let user = User(name: "Алексей") // objc_retain(user)
// что-то делаем с user
// objc_release(user) - здесь, при выходе из области видимости
}


Ключевой момент: ARC не следит за объектами во время выполнения программы. Он не активный участник рантайма. Вся его работа заканчивается в момент компиляции. Он просто расставляет вызовы функций retain и release в правильных местах.


Рантайм - слепой исполнитель:

Если ARC - архитектор, то рантайм - строительная бригада, которая работает строго по чертежам. Ее задача предельно проста: выполнять инструкции.

Когда рантайм видит objc_retain(ptr), он увеличивает счетчик ссылок в заголовке объекта. Когда видит objc_release(ptr) - уменьшает. Когда счетчик достигает нуля - немедленно вызывает деструктор и освобождает память.

Важное уточнение: счетчик ссылок - это не абстракция Swift. Это физическое поле в заголовке объекта в куче памяти. Вы не можете получить к нему доступ из Swift-кода, потому что это низкоуровневая деталь реализации Objective-C runtime, который Swift использует под капотом на Apple-платформах.


Autorelease - не то, что вы думаете:

Слово autorelease вызывает самые странные ассоциации. «Автоматическое освобождение»? «Отложенный сборщик мусора»? На самом деле, это просто еще одна инструкция, которую ARC может вставить.

Autorelease не освобождает память. Он говорит: «Не делай release сейчас, сделай его позже, когда завершится текущий autorelease pool».


Это нужно в двух основных случаях:

🔵Переходы между Swift и Objective-C: когда объект передается в Objective-C код, и момент окончания владения неясен на этапе компиляции.

🔵Возврат значений из методов: особенно в Objective-C-стиле, где принято возвращать autoreleased объекты.

Но вот что действительно важно: autorelease pool - это не магический контейнер, который хранит объекты. Это просто очередь release-операций, выполнение которой отложено.

В чистом Swift-коде autorelease используется все реже. Компилятор становится умнее и может определить момент release точнее. Но он все еще нужен для совместимости с Objective-C и некоторых случаях.


💡 Вывод:

ARC в Swift - это не магия и не активный сборщик мусора. Это компиляторная технология, которая превращает высокоуровневый Swift-код в низкоуровневые инструкции управления памятью. Ее работа заканчивается в момент компиляции. Все, что происходит во время выполнения - просто механическое выполнение этих инструкций рантаймом.

Понимание этого разделения ответственности критически важно. Оно объясняет, почему одни оптимизации памяти работают, а другие нет. Почему autorelease pool важен в одних контекстах и бесполезен в других. Почему вы не можете «посмотреть» счетчик ссылок из Swift.


➡️ Подписаться на канал
Мобильный трудоголик
  • ❤ 10
  • 👍 3
  • 🔥 1
  • 👀 1
More from @hardworkerit
  1. Oct 1, 2026🔢 Работа с Picture-in-Picture в iOS. Picture-in-Picture - системная функция iOS, которая…
  2. Sep 29, 2026🔢 Управление тулбарами на iPhone Duo. На iPhone Duo элементы управления навигацией, дейст…
  3. Sep 27, 2026🔢 Новые возможности Hashable в Swift 6.4 В Swift 6.4 добавили Hashable для нескольких тип…
  4. Sep 25, 2026🔢 Приватные свойства больше не ломают memberwise инициализатор в Swift 6.4 Swift автомати…
  5. Sep 24, 2026👨‍💻 Почему разработчики ненавидят своих менеджеров. Всем привет! Сегодня хочу разобрать…
  6. Sep 22, 2026🔢 Релиз Swift 6.4: главные изменения для разработчиков. Swift 6.4 вышел. Это обновление п…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →