Что такое retain в управлении памятью Objective-C?

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

Ответ

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