Для чего используется autorelease в Objective-C?

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

Ответ

autorelease — это механизм ручного управления памятью (MRC) в Objective-C, который откладывает освобождение объекта до завершения текущего autorelease pool. Объект, отправленный в autorelease pool, получит сообщение release автоматически при дренировании пула.

Основное назначение:

  • Возврат объекта из метода без передачи владения (ownership) вызывающей стороне.
  • Удобство при создании временных объектов, которые должны "пережить" текущий метод.

Пример в MRC:

- (NSString *)createGreeting {
    // Объект будет автоматически released после выхода из autorelease pool
    return [[[NSString alloc] initWithFormat:@"Hello, %@", self.username] autorelease];
}

В ARC (Automatic Reference Counting):

  • autorelease используется компилятором автоматически.
  • Явное создание @autoreleasepool полезно для контроля пикового потребления памяти:
    // Полезно в циклах, создающих много временных объектов
    for _ in 0..<10000 {
    autoreleasepool {
        let tempData = Data(repeating: 0, count: 1024)
        // tempData будет освобождена здесь, а не в конце цикла
    }
    }

    Ключевое отличие: В MRC autorelease используется явно, в ARC — неявно, но пулы остаются для оптимизации памяти.