Ответ
В Objective-C retain — это метод, который увеличивает счётчик сильных ссылок на объект. Это основа модели ручного управления памятью (MRC).
Как это работает:
Каждый объект имеет внутренний счётчик ссылок (retainCount). Вызов retain увеличивает его на 1, продлевая время жизни объекта. Объект уничтожается, когда счётчик становится равным 0 после вызова release.
Практический пример MRC:
// Создаём объект. 'alloc' даёт начальный retainCount = 1.
NSString *str = [[NSString alloc] initWithString:@"Hello"];
// Сохраняем ссылку в свойстве (предполагается ручная реализация сеттера).
[self setMyString:str]; // Внутри сеттера: [newValue retain];
// Освобождаем локальную ссылку.
[str release]; // retainCount уменьшается, но объект жив, так как свойство его удерживает.
Эволюция:
- MRC: Программист вручную балансирует
retainиrelease. - ARC: Компилятор анализирует код и автоматически вставляет корректные вызовы
retainиrelease, избавляя разработчика от этой рутины. Явный вызовretainзапрещён.
Главная опасность: Несбалансированные вызовы — лишний retain вызывает утечку, лишний release — краш при обращении к освобождённой памяти.