В чем разница между ARC и MRC?

«В чем разница между ARC и MRC?» — вопрос из категории Управление памятью, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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).