Что такое метод `release` в Objective-C при ручном управлении памятью (MRC)?

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

Ответ

release — это метод экземпляра в Objective-C, используемый в модели Manual Reference Counting (MRC). Он уменьшает счетчик владения (retain count) объекта на единицу. Когда счетчик достигает нуля, система немедленно освобождает память объекта (деаллоцирует его).

Принцип работы:

  1. Методы alloc, new, copy, mutableCopy создают объект с retain count = 1.
  2. [obj retain] увеличивает счетчик на 1.
  3. [obj release] уменьшает счетчик на 1.

Пример MRC:

// Создание объекта. Retain count = 1.
NSObject *myObject = [[NSObject alloc] init]; 

// Увеличиваем счетчик. Retain count = 2.
[myObject retain]; 

// Уменьшаем счетчик. Retain count = 1. Объект еще жив.
[myObject release]; 

// Уменьшаем счетчик до 0. Объект деаллоцируется.
[myObject release]; 
// Дальнейшее обращение к myObject вызовет краш (EXC_BAD_ACCESS).

Критически важные правила:

  • Баланс: Каждому retain, alloc, copy, mutableCopy должен соответствовать release.
  • Не вызывать release для авторелизных объектов: Например, для объектов, возвращаемых сконвенциональными методами (не начинающимися с alloc/new/copy).
  • ARC: В современных проектах с Automatic Reference Counting (ARC) компилятор автоматически вставляет вызовы retain и release, поэтому их явное использование запрещено и вызовет ошибку компиляции.