Ответ
Retain — это метод ручного управления памятью (MRC) в Objective-C, который увеличивает счётчик ссылок (retain count) объекта на 1. Объект остаётся в памяти, пока его счётчик не станет равен 0.
Пример в MRC:
NSObject *obj = [[NSObject alloc] init]; // retainCount = 1
[obj retain]; // retainCount = 2
[obj release]; // retainCount = 1
[obj release]; // retainCount = 0 -> объект деаллоцируется
Ключевые моменты:
- MRC (Manual Reference Counting): Разработчик вручную вызывает
retain,releaseиautorelease. - ARC (Automatic Reference Counting): Компилятор автоматически вставляет вызовы
retainиrelease. - Проблема: Несбалансированные вызовы
retain/releaseприводят к утечкам памяти (еслиretain>release) или к раннему освобождению и крашам (еслиrelease>retain). - Циклические ссылки: Если два объекта удерживают друг друга (
retain), они никогда не будут освобождены, что приводит к утечке памяти.