Что означает retain в контексте Objective-C?

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

Ответ

В 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 — краш при обращении к освобождённой памяти.