Что такое retain в Objective-C и Swift?

«Что такое retain в Objective-C и Swift?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Retain — это операция увеличения счётчика сильных ссылок на объект в системах управления памятью с подсчётом ссылок (Reference Counting).

В Objective-C (явный MRC):

// Программист управляет памятью вручную
id object = [[NSObject alloc] init]; // retainCount = 1
[object retain]; // retainCount = 2 (явный вызов)
[object release]; // retainCount = 1

В Objective-C/Swift (ARC): Операции retain и release выполняются автоматически компилятором при присваивании сильных (strong) ссылок.

// Swift (ARC)
var object1: NSObject? = NSObject() // retainCount = 1
var object2 = object1 // Компилятор автоматически 'удерживает' объект (retain)
// object1 = nil, object2 = nil // Компилятор автоматически 'отпускает' (release)
Ключевые различия: Аспект MRC (Objective-C) ARC (Objective-C/Swift)
Управление Ручное, вызовы [obj retain]/[obj release] Автоматическое, компилятор вставляет вызовы
Безопасность Высокий риск утечек и крашей Значительно безопаснее
Циклические ссылки Присутствуют Присутствуют, решаются через weak/unowned

Вывод: retain — это фундаментальная операция подсчёта ссылок. В MRC её вызывают вручную, в ARC — она невидима для разработчика, но лежит в основе работы автоматического управления памятью.