В чем разница между retain/release и autorelease в управлении памятью Objective-C?

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

Ответ

Это методы ручного управления памятью (MRC) в Objective-C.

retain / release

  • retain — увеличивает счетчик ссылок (retain count) объекта на 1.
  • release — уменьшает счетчик ссылок на 1. Когда счетчик достигает 0, память объекта немедленно освобождается.
  • Прямое и предсказуемое управление временем жизни.
// MRC (Manual Reference Counting)
NSObject *obj = [[NSObject alloc] init]; // retainCount = 1
[obj retain]; // retainCount = 2
[obj release]; // retainCount = 1
[obj release]; // retainCount = 0 -> объект деаллоцирован

autorelease

  • autorelease — добавляет объект в текущий autoreleasepool, откладывая отправку release.
  • release будет вызван автоматически, когда пул будет дренирован (обычно в конце цикла runloop).
  • Удобно для возврата временных объектов из методов.
- (NSString *)generateName {
    // Объект будет освобожден позже, когда дренируется autoreleasepool
    return [[[NSString alloc] initWithFormat:@"Name_%d", 1] autorelease];
}

Практическое значение: С появлением ARC (Automatic Reference Counting) необходимость вручную вызывать эти методы отпала. Однако понимание важно для работы с legacy-кодом, Core Foundation (где используется CFRetain/CFRelease) и для низкоуровневой оптимизации с использованием @autoreleasepool.