Ответ
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 — она невидима для разработчика, но лежит в основе работы автоматического управления памятью.