Ответ
ARC (Automatic Reference Counting) и MRC (Manual Reference Counting) — это две модели управления памятью в среде Apple, основанные на подсчете ссылок.
| Критерий | MRC (Ручной подсчет) | ARC (Автоматический подсчет) |
|---|---|---|
| Управление | Ручное. Программист явно вызывает retain, release, autorelease. |
Автоматическое. Компилятор вставляет вызовы retain/release на этапе компиляции. |
| Язык | Objective-C (обязательно). | Swift и современный Objective-C. |
| Безопасность | Высокий риск ошибок: утечки (забыл release) или раннее освобождение (забыл retain). |
Гораздо безопаснее. Компилятор минимизирует человеческий фактор. |
| Производительность | Накладные расходы на вызовы в runtime. | Накладные расходы те же, но код генерируется компилятором оптимально. |
| Циклы ссылок | Программист должен обнаруживать и разрывать вручную. | Требуют такого же ручного управления через weak/unowned. |
Пример MRC (Objective-C):
// Создание объекта (retainCount = 1)
MyClass *obj1 = [[MyClass alloc] init];
// Ручное увеличение счетчика (retainCount = 2)
[obj1 retain];
// Ручное уменьшение счетчика (retainCount = 1)
[obj1 release];
// Освобождение памяти (retainCount = 0, объект деаллоцируется)
[obj1 release];
// obj1 теперь "dangling pointer"
Пример ARC (Swift/Obj-C):
// Компилятор сам управляет временем жизни
var object: MyClass? = MyClass() // retain
object = nil // release (если это последняя сильная ссылка)
Вывод: ARC — это эволюция MRC. Он переносит рутинную и error-prone работу с подсчетом ссылок с программиста на компилятор, значительно повышая безопасность и продуктивность разработки. MRC сегодня используется крайне редко, в основном при поддержке старого кода или при работе с Core Foundation API вручную (правило Create/Copy -> Release).